问题:在Python中,如何将“ datetime”对象转换为秒?
为这个简单的问题表示歉意…我是Python的新手…我四处搜寻,似乎没有任何反应。
我有一堆datetime对象,我想计算每个对象过去某个固定时间以来的秒数(例如,自1970年1月1日起)。
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
这似乎只能区分具有不同日期的日期:
t.toordinal()
任何帮助深表感谢。
回答 0
在1970年1月1日这个特殊日期,有多种选择。
对于任何其他开始日期,您需要以秒为单位获取两个日期之间的差额。将两个日期相减得到一个timedelta
对象,从Python 2.7开始,该对象具有total_seconds()
功能。
>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0
通常以UTC指定开始日期,因此,要获得正确的结果,datetime
您也应使用UTC输入该公式。如果您datetime
尚未使用UTC,则需要先进行转换,再使用它,或附加tzinfo
具有适当偏移量的类。
如评论中所述,如果您有tzinfo
附件,datetime
则在开始日期也需要一个附件,否则减法将会失败;对于上面的示例,tzinfo=pytz.utc
如果使用Python 2或tzinfo=timezone.utc
Python 3 ,我会添加。
回答 1
要获取Unix时间(自1970年1月1日以来的秒数):
>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0
回答 2
从Python 3.3开始,使用此datetime.timestamp()
方法变得非常容易。当然,这仅在需要从1970-01-01 UTC开始的秒数时才有用。
from datetime import datetime
dt = datetime.today() # Get timezone naive now
seconds = dt.timestamp()
返回值将是代表偶数秒的浮点数。如果datetime是时区朴素的(如上例所示),则将假定datetime对象代表本地时间,即,它是从您所在位置的当前时间到1970-01-01 UTC的秒数。
回答 3
也许离题:从日期时间获取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偏移量。在此示例中,这是+1小时,即UTC + 0100。
参考文献:
- datetime.date.timetuple
- 时间
- datetime.datetime.fromtimestamp
- 在介绍时模块解释POSIX时间,1970年的时代,UTC,TZ,DST …
回答 4
int (t.strftime("%s"))
也可以
回答 5
从python文档:
timedelta.total_seconds()
返回持续时间中包含的总秒数。相当于
(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
在启用真除法的情况下进行计算。
请注意,对于非常长的时间间隔(在大多数平台上大于270年),此方法将失去微秒的精度。
此功能是2.7版中的新增功能。
回答 6
要将代表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()
请参阅如何在Python中将本地时间转换为UTC?如果tz数据库在给定平台上可用;仅有stdlib的解决方案可能有效。
如果您需要<3.3
Python版本的解决方案,请点击链接。
回答 7
我尝试了标准库的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