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.timedelta
chứ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.
timedelta
khô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 timedelta
và đừ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()-start
biế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.time
giá 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 timedelta
và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ì 1
bạ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.fromordinal
sẽ luôn trả về datetime
đối tượng có time
thà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.0
và 666.1
giá 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.relativedelta
thuận tiện nếu bạn cần truy cập hàng giờ, phút và giây như phao. datetime.timedelta
khô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=5440
thay 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