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的时差。
答案 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