Python日期时间和熊猫在同一日期给出不同的时间戳

时间:2020-06-29 19:16:57

标签: python pandas datetime

from datetime import datetime
import pandas as pd

date="2020-02-07T16:05:16.000000000"

#Convert using datetime
t1=datetime.strptime(date[:-3],'%Y-%m-%dT%H:%M:%S.%f')

#Convert using Pandas
t2=pd.to_datetime(date)

#Subtract the dates
print(t1-t2)

#subtract the date timestamps
print(t1.timestamp()-t2.timestamp())

在此示例中,我的理解是datetime和pandas都应使用时区天真日期。谁能解释为什么日期之间的差异为零,但时间戳之间的差异不为零?对我来说,这是5个小时的休假,这是我的时区与GMT的时差。

1 个答案:

答案 0 :(得分:0)

从Python的datetime.datetime类派生的朴素的datetime对象表示本地时间。在the docs中,这是显而易见的,但是仍然可以让人绞尽脑汁。如果您在其上调用timestamp方法,则返回的POSIX时间戳应按原样引用UTC(自纪元以来的秒数)。

来自Python日期时间对象,幼稚的pandas.Timestamp的行为可能是违反直觉的(我认为不是那么明显)。从tz天真字符串以相同的方式派生,它不表示本地时间。如果调用timestamp方法,则它表示UTC。您可以通过将datetime对象本地化为UTC来进行验证:

from datetime import datetime, timezone
import pandas as pd

date = "2020-02-07T16:05:16.000000000"

t1 = datetime.strptime(date[:-3], '%Y-%m-%dT%H:%M:%S.%f')
t2 = pd.to_datetime(date)

print(t1.replace(tzinfo=timezone.utc).timestamp()-t2.timestamp())
# 0.0

另一种方法可以使pandas.Timestamp时区感知,例如

t3 = pd.to_datetime(t1.astimezone())
# e.g. Timestamp('2020-02-07 16:05:16+0100', tz='Mitteleuropäische Zeit')

print(t1.timestamp()-t3.timestamp())
# 0.0

我的底线是,如果您知道您拥有的时间戳代表某个时区,请使用可识别时区的日期时间,例如用于UTC

import pytz # need to use pytz here since pandas uses that internally

t1 = datetime.strptime(date[:-3], '%Y-%m-%dT%H:%M:%S.%f').replace(tzinfo=pytz.UTC)
t2 = pd.to_datetime(date, utc=True)

print(t1 == t2)
# True
print(t1-t2)
# 0 days 00:00:00
print(t1.timestamp()-t2.timestamp())
# 0.0