Python的
datetime.datetime
类的Naive datetime对象代表本地时间。这在
文档中是显而易见的,但仍然可能会让人感到困惑。如果您在其上调用
timestamp
方法,则返回的POSIX时间戳应该是UTC(自纪元以来的秒数)。
从Python datetime对象转换而来,一个naive的
pandas.Timestamp
的行为可能不太直观(我认为这并不是那么明显)。同样是从tz-naive字符串派生出来的,它不代表当地时间,而是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())
另一种方法是使
pandas.Timestamp
具有时区意识,例如:
t3 = pd.to_datetime(t1.astimezone())
print(t1.timestamp() - t3.timestamp())
我的底线是,如果你知道你所拥有的时间戳代表特定的时区,请使用时区感知的日期时间,例如UTC。
import pytz
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)
print(t1-t2)
print(t1.timestamp()-t2.timestamp())