Tôi có một chức năng trả về thông tin trong vài giây, nhưng tôi cần lưu trữ thông tin đó trong vài giờ: phút: giây.
Có cách nào dễ dàng để chuyển đổi giây thành định dạng này trong Python không?
Tôi có một chức năng trả về thông tin trong vài giây, nhưng tôi cần lưu trữ thông tin đó trong vài giờ: phút: giây.
Có cách nào dễ dàng để chuyển đổi giây thành định dạng này trong Python không?
Câu trả lời:
Bạn có thể sử dụng datetime.timedeltachức năng:
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
str(datetime.timedelta(seconds=round(666666.55)))kết xuất chính xác ngày; thay thế số thập phân giây.
timedeltakhông tràn an toàn và không thể thực hiện chính xác các phép toán, ví dụ str(timedelta(hours=8) - timedelta(hours=10))kết quả là '-1 day, 22:00:00'và giải pháp dựa trên số nguyên chính xác cho những tình huống mà bạn cần '-02:00:00'.
Bằng cách sử dụng divmod()hàm, chỉ thực hiện một phép chia duy nhất để tạo ra cả thương số và phần còn lại, bạn có thể có kết quả rất nhanh chỉ với hai phép toán:
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
Và sau đó sử dụng định dạng chuỗi để chuyển đổi kết quả thành đầu ra mong muốn của bạn:
print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
'%d:%02dmn' % (seconds / 60, seconds % 60)
d, h = divmod(h, 24).
m, d = divmod(m, 31). Rất tiếc, không, bạn không thể. Tệ hơn, mã của bạn sẽ sai nếu bước nhảy vọt vào trò chơi. Câu chuyện dài ngắn: sử dụng timedeltavà đừng lộn xộn với lịch, nó sẽ cắn bạn.
timedeltađối phó với giây nhuận? Tôi nghi ngờ là không. Có rất nhiều ứng dụng mà toán học đơn giản này là quá đủ.
str(timedelta(hours=8) - timedelta(hours=10))kết quả là '-1 ngày, 22:00:00' vì vậy ... idk nếu nó hoạt động với giây nhuận nhưng nó không hoạt động với các số âm.
Tôi khó có thể đặt tên theo cách dễ dàng (ít nhất là tôi không thể nhớ cú pháp), nhưng có thể sử dụng time.strftime , giúp kiểm soát định dạng nhiều hơn:
from time import strftime
from time import gmtime
strftime("%H:%M:%S", gmtime(666))
'00:11:06'
strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'
gmtime được sử dụng để chuyển đổi giây sang định dạng tuple đặc biệt strftime()yêu cầu.
Lưu ý: Cắt ngắn sau 23:59:59
time.strftime('%d %H:%M:%S', time.gmtime(1))=> '1 ngày, 0:00:01'.
datetime:':0>8'định dạng:from datetime import timedelta
"{:0>8}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{:0>8}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
':0>8'định dạng:"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
time:from time import gmtime
from time import strftime
# NOTE: The following resets if it goes over 23:59:59!
strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'
strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'
strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'
strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong
"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
without ':0>8':Ví dụ thiếu một số 0 hàng đầu {:0>8}ở bên trái 8 số không.
time.time()-startbiến. Bất kỳ cái nhìn sâu sắc? TypeError: non-empty format string passed to object.__format__
datetime.now()thay vì time.time()tạo đối tượng timedelta của mình và tôi cũng gặp lỗi tương tự.
str()nếu bạn định sử dụng một định dạng như 0>8: "{:0>8}".format(str(datetime.timedelta(seconds=666777))). Kiểm tra câu trả lời này để biết thêm.
Đây là mẹo nhanh của tôi:
from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
Để biết thêm thông tin Truy cập: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan
Nếu bạn cần nhận được datetime.timegiá trị, bạn có thể sử dụng thủ thuật này:
my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
Bạn không thể thêm timedeltavào time, nhưng có thể thêm nó vào datetime.
CẬP NHẬT : Một biến thể khác của cùng một kỹ thuật:
my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
Thay vì 1bạn có thể sử dụng bất kỳ số nào lớn hơn 0. Ở đây chúng tôi sử dụng thực tế là datetime.fromordinalsẽ luôn trả về datetimeđối tượng có timethành phần bằng không.
Đây là cách tôi có nó.
def sec2time(sec, n_msec=3):
''' Convert seconds to 'D days, HH:MM:SS.FFF' '''
if hasattr(sec,'__len__'):
return [sec2time(s) for s in sec]
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
if n_msec > 0:
pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec)
else:
pattern = r'%02d:%02d:%02d'
if d == 0:
return pattern % (h, m, s)
return ('%d days, ' + pattern) % (d, h, m, s)
Vài ví dụ:
$ sec2time(10, 3)
Out: '00:00:10.000'
$ sec2time(1234567.8910, 0)
Out: '14 days, 06:56:07'
$ sec2time(1234567.8910, 4)
Out: '14 days, 06:56:07.8910'
$ sec2time([12, 345678.9], 3)
Out: ['00:00:12.000', '4 days, 00:01:18.900']
str(datetime.timedelta(seconds=666))
666.0và 666.1giá trị.
Các bộ sau đây làm việc cho tôi.
def sec_to_hours(seconds):
a=str(seconds//3600)
b=str((seconds%3600)//60)
c=str((seconds%3600)%60)
d=["{} hours {} mins {} seconds".format(a, b, c)]
return d
print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']
print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']
dateutil.relativedeltathuận tiện nếu bạn cần truy cập hàng giờ, phút và giây như phao. datetime.timedeltakhông cung cấp một giao diện tương tự.
from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
int(rt.hours), int(rt.minutes), int(rt.seconds)))
Bản in
40.0
01:30:40
seconds=5440thay vì seconds=5540. Tôi thích câu trả lời của bạn, mặc dù!
giờ (h) được tính bằng cách chia sàn (bằng //) giây bằng 3600 (60 phút / giờ * 60 giây / phút)
phút (m) được tính bằng cách chia tầng của các giây còn lại (phần còn lại từ tính toán giờ, theo%) cho 60 (60 giây / phút)
tương tự, giây (s) bằng phần còn lại của giờ và phút tính toán.
Phần còn lại chỉ là định dạng chuỗi!
def hms(seconds):
h = seconds // 3600
m = seconds % 3600 // 60
s = seconds % 3600 % 60
return '{:02d}:{:02d}:{:02d}'.format(h, m, s)
print(hms(7500)) # Should print 02h05m00s
division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes
PS Mã của tôi không chuyên nghiệp