ฉันมีฟังก์ชั่นที่คืนค่าข้อมูลเป็นวินาที แต่ฉันต้องการเก็บข้อมูลนั้นเป็นชั่วโมง: นาที: วินาที
มีวิธีง่าย ๆ ในการแปลงวินาทีเป็นรูปแบบนี้ใน Python หรือไม่?
ฉันมีฟังก์ชั่นที่คืนค่าข้อมูลเป็นวินาที แต่ฉันต้องการเก็บข้อมูลนั้นเป็นชั่วโมง: นาที: วินาที
มีวิธีง่าย ๆ ในการแปลงวินาทีเป็นรูปแบบนี้ใน Python หรือไม่?
คำตอบ:
คุณสามารถใช้datetime.timedelta
ฟังก์ชั่น:
>>> 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)))
ถูกต้องทำให้วัน; แทนที่ทศนิยมวินาที
timedelta
ไม่ปลอดภัยมากเกินไปและไม่สามารถดำเนินการทางคณิตศาสตร์ได้อย่างถูกต้องเช่นstr(timedelta(hours=8) - timedelta(hours=10))
ผลลัพธ์คือผลลัพธ์'-1 day, 22:00:00'
และวิธีแก้ปัญหาจำนวนเต็มเหมาะสำหรับสถานการณ์ที่คุณต้องการ '-02:00:00'
ด้วยการใช้divmod()
ฟังก์ชั่นซึ่งทำหน้าที่เพียงส่วนเดียวในการสร้างทั้งความฉลาดและส่วนที่เหลือคุณสามารถได้ผลลัพธ์อย่างรวดเร็วด้วยการดำเนินการทางคณิตศาสตร์เพียงสองครั้ง:
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
จากนั้นใช้การจัดรูปแบบสตริงเพื่อแปลงผลลัพธ์เป็นผลลัพธ์ที่คุณต้องการ:
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)
แล้วเดือน Oooops ไม่คุณทำไม่ได้ รหัสของคุณจะผิดถ้าเผ่นวินาทีเข้ามาในเกม เรื่องสั้นสั้น ๆ : ใช้timedelta
และไม่ยุ่งกับปฏิทินมันจะกัดคุณ
timedelta
จัดการกับเผ่นวินาทีหรือไม่ ฉันไม่สงสัย มีแอปพลิเคชั่นมากมายที่คณิตศาสตร์อย่างง่ายนี้เพียงพอมากกว่า
str(timedelta(hours=8) - timedelta(hours=10))
ผลที่ได้คือ '-1 วัน 22:00:00' ดังนั้น ... idk ถ้ามันทำงานด้วยการกระโดดวินาที แต่มันใช้ไม่ได้กับจำนวนลบ
ฉันแทบจะไม่สามารถตั้งชื่อได้ว่าเป็นวิธีที่ง่าย (อย่างน้อยฉันไม่สามารถจำไวยากรณ์ได้) แต่มันเป็นไปได้ที่จะใช้time.strftimeซึ่งให้การควบคุมการจัดรูปแบบได้ดียิ่งขึ้น:
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ใช้ในการแปลงวินาทีเป็นรูปแบบ tuple พิเศษที่strftime()
ต้องการ
หมายเหตุ: ตัดทอนหลังจาก 23:59:59 น
time.strftime('%d %H:%M:%S', time.gmtime(1))
=> '1 วัน, 0:00:01'
datetime
:':0>8'
รูปแบบ: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'
รูปแบบ:"{}".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':
ตัวอย่างไม่มีศูนย์นำหน้า 0 {:0>8}
ศูนย์ไปทางซ้าย 8 ศูนย์
time.time()-start
ตัวแปร ความเข้าใจใด ๆ TypeError: non-empty format string passed to object.__format__
datetime.now()
แทนtime.time()
การสร้างวัตถุ timedelta ของฉันและฉันได้รับข้อผิดพลาดเดียวกัน
นี่คือเคล็ดลับด่วนของฉัน:
from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
สำหรับข้อมูลเพิ่มเติมโปรดไปที่: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan
หากคุณต้องการความdatetime.time
คุ้มค่าคุณสามารถใช้เคล็ดลับนี้:
my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
คุณไม่สามารถเพิ่มtimedelta
ไปแต่สามารถเพิ่มไปยังtime
datetime
UPD : อีกรูปแบบของเทคนิคเดียวกัน:
my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
แทนที่จะเป็น1
คุณสามารถใช้ตัวเลขใดก็ได้ที่มากกว่า 0 ตรงนี้เราใช้ความจริงที่ว่าdatetime.fromordinal
จะคืนค่าdatetime
ออบเจกต์ด้วยtime
องค์ประกอบที่เป็นศูนย์เสมอ
นี่คือวิธีที่ฉันได้รับ
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)
ตัวอย่างบางส่วน:
$ 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
และ666.1
ค่า
ชุดต่อไปนี้ใช้งานได้สำหรับฉัน
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
สะดวกถ้าคุณต้องการเข้าถึงชั่วโมงนาทีและวินาทีเช่นเดียวกับลอยเช่นกัน datetime.timedelta
ไม่ได้จัดให้มีอินเตอร์เฟซที่คล้ายกัน
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)))
พิมพ์
40.0
01:30:40
seconds=5440
seconds=5540
ฉันชอบคำตอบของคุณ!
ชั่วโมง (h) คำนวณโดยการแบ่งชั้น (โดย //) วินาทีโดย 3600 (60 นาที / ชม. * 60 วินาที / นาที)
นาที (m) คำนวณโดยการแบ่งชั้นของวินาทีที่เหลือ (ส่วนที่เหลือจากการคำนวณชั่วโมงโดย%) 60 (60 วินาที / นาที)
ในทำนองเดียวกันวินาที (s) โดยส่วนที่เหลือของการคำนวณชั่วโมงและนาที
ส่วนที่เหลือเป็นเพียงการจัดรูปแบบสตริง!
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
คุณสามารถแบ่งวินาทีโดย 60 เพื่อให้ได้นาที
import time
seconds = time.time()
minutes = seconds / 60
print(minutes)
เมื่อคุณหารด้วย 60 อีกครั้งคุณจะได้รับชั่วโมง
division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes
PS รหัสของฉันไม่เป็นมืออาชีพ