很抱歉问这么简单的问题…我是Python的新手…我到处都找过了,似乎都没用。
我有一堆datetime对象,我想为每个对象计算从过去的固定时间(例如从1970年1月1日以来)开始的秒数。
import datetime t = datetime.datetime(2009, 10, 21, 0, 0)
这似乎只是区分有不同日期的日期:
t.toordinal()
任何帮助都非常感激。
来自python文档:
timedelta.total_seconds()
返回持续时间中包含的总秒数。相当于
(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
启用真除法时计算。
注意,对于非常大的时间间隔(在大多数平台上超过270年),这种方法将失去微秒精度。
此功能是2.7版中的新功能。
获取Unix时间(从1970年1月1日开始的秒数):
>>> import datetime, time >>> t = datetime.datetime(2011, 10, 21, 0, 0) >>> time.mktime(t.timetuple()) 1319148000.0
对于1970年1月1日这个特殊的日子,有多种选择。
对于任何其他开始日期,您需要以秒为单位获得两个日期之间的差异。减去两个日期会得到一个timedelta对象,从Python 2.7开始有一个total_seconds()函数。
timedelta
total_seconds()
>>> (t-datetime.datetime(1970,1,1)).total_seconds() 1256083200.0
开始日期通常以UTC为单位指定,因此为了得到正确的结果,你输入到这个公式中的datetime也应该以UTC为单位。如果你的datetime不是UTC,你需要在使用它之前转换它,或者附加一个具有适当偏移量的tzinfo类。
datetime
tzinfo
正如评论中所指出的,如果你的tzinfo附加在你的datetime上,那么你也需要在开始日期上有一个,否则减法将失败;对于上面的例子,如果使用Python 2,我会添加tzinfo=pytz.utc,如果使用Python 3,我会添加tzinfo=timezone.utc。
tzinfo=pytz.utc
tzinfo=timezone.utc
int (t.strftime("%s"))也可以工作
int (t.strftime("%s"))
从datetime获取UNIX/POSIX时间并将其转换回来:
>>> import datetime, time >>> dt = datetime.datetime(2011, 10, 21, 0, 0) >>> s = time.mktime(dt.timetuple()) >>> s 1319148000.0 # and back >>> datetime.datetime.fromtimestamp(s) datetime.datetime(2011, 10, 21, 0, 0)
请注意,不同的时区对结果有影响,例如,我当前的TZ/DST返回:
>>> time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple()) -3600 # -1h
因此应该考虑使用UTC版本的函数归一化为UTC。
请注意以前的结果可以用来计算当前时区的UTC偏移量。在本例中,这是+1h,即UTC+0100。
引用:
我尝试了标准库的calendar.timegm,它工作得很好:
# convert a datetime to milliseconds since Epoch def datetime_to_utc_milliseconds(aDateTime): return int(calendar.timegm(aDateTime.timetuple())*1000)
裁判:https://docs.python.org/2/library/calendar.html#calendar.timegm
从Python 3.3开始,使用datetime.timestamp()方法,这变得超级简单。当然,这只在您需要1970-01-01 UTC的秒数时才有用。
datetime.timestamp()
from datetime import datetime dt = datetime.today() # Get timezone naive now seconds = dt.timestamp()
返回值将是一个浮点数,表示秒的几分之一。如果datetime是无时区的(如上例所示),则假定datetime对象表示本地时间,即从您所在位置的当前时间到UTC 1970-01-01的秒数。
将以UTC表示时间的datetime对象转换为POSIX时间戳:
from datetime import timezone seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()
将表示本地时区时间的datetime对象转换为POSIX时间戳:
import tzlocal # $ pip install tzlocal local_timezone = tzlocal.get_localzone() seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()
如果tz数据库在给定平台上可用,请参见如何在Python中将本地时间转换为UTC ?;只使用stdlib的解决方案可能有效。
如果你需要<3.3 Python版本的解决方案,请参考链接。
<3.3
在python 3中,以毫秒为单位计算一个代码块的处理时间的标准方法。X表示:
import datetime t_start = datetime.datetime.now() # Here is the python3 code, you want # to check the processing time of t_end = datetime.datetime.now() print("Time taken : ", (t_end - t_start).total_seconds()*1000, " ms")
Python提供了datetime操作来计算两个日期之间的差值。在你的情况下,这将是:
t - datetime.datetime(1970,1,1)
返回的值是一个timedelta对象,您可以使用成员函数total_seconds来获得以秒为单位的值。
(t - datetime.datetime(1970,1,1)).total_seconds()
import datetime import math def getSeconds(inputDate): time = datetime.date.today().strftime('%m/%d/%Y') date_time = datetime.datetime.strptime(time, '%m/%d/%Y') msg = inputDate props = msg.split(".") a_timedelta = datetime.timedelta if(len(props)==3): a_timedelta = date_time - datetime.datetime(int(props[0]),int(props[1]),int(props[2])) else: print("Invalid date format") return seconds = math.trunc(a_timedelta.total_seconds()) print(seconds) return seconds
示例getSeconds(“2022.1.1")
我并没有在所有的答案中看到这一点,尽管我猜这是默认的需求:
t_start = datetime.now() sleep(2) t_end = datetime.now() duration = t_end - t_start print(round(duration.total_seconds()))
如果不使用.total_seconds(),则抛出:TypeError: type datetime.timedelta doesn't define __round__ method。
.total_seconds()
TypeError: type datetime.timedelta doesn't define __round__ method
例子:
>>> duration datetime.timedelta(seconds=53, microseconds=621861) >>> round(duration.total_seconds()) 54 >>> duration.seconds 53
执行duration.seconds只需要花费秒,忽略微秒,与运行math.floor(duration.total_seconds())相同。
duration.seconds
math.floor(duration.total_seconds())
比较4种最常见的方法,以确保准确性:
方法一:手动计算
from datetime import datetime total1 = int(datetimeobj.strftime('%S')) total1 += int(datetimeobj.strftime('%M')) * 60 total1 += int(datetimeobj.strftime('%H')) * 60 * 60 total1 += (int(datetimeobj.strftime('%j')) - 1) * 60 * 60 * 24 total1 += (int(datetimeobj.strftime('%Y')) - 1970) * 60 * 60 * 24 * 365 print ("Method #1: Manual") print ("Before: %s" % datetimeobj) print ("Seconds: %s " % total1) print ("After: %s" % datetime.fromtimestamp(total1))
输出:
Method #1: Manual Before: 1970-10-01 12:00:00 Seconds: 23630400 After: 1970-10-01 16:00:00
精度测试:FAIL(时区偏移)
方法二:时间模块
import time from datetime import datetime total2 = int(time.mktime(datetimeobj.timetuple())) print ("Method #2: Time Module") print ("Before: %s" % datetimeobj) print ("Seconds: %s " % total2) print ("After: %s" % datetime.fromtimestamp(total2))
Method #2: Time Module Before: 1970-10-01 12:00:00 Seconds: 23616000 After: 1970-10-01 12:00:00
准确度测试:通过
方法三:日历模块
import calendar from datetime import datetime total3 = calendar.timegm(datetimeobj.timetuple()) print ("Method #3: Calendar Module") print ("Before: %s" % datetimeobj) print ("Seconds: %s " % total3) print ("After: %s" % datetime.fromtimestamp(total3))
Method #3: Calendar Module Before: 1970-10-01 12:00:00 Seconds: 23616000 After: 1970-10-01 16:00:00
方法四:Datetime时间戳
from datetime import datetime total4 = datetimeobj.timestamp() print ("Method #4: datetime timestamp") print ("Before: %s" % datetimeobj) print ("Seconds: %s " % total4) print ("After: %s" % datetime.fromtimestamp(total4))
结论