Pandas Timestamp与Python DateTime时区解析差异:为何a与b不相等?
为什么Pandas Timestamp转成的datetime和直接创建的datetime不相等?
这事儿我之前踩过坑!核心原因就是Pandas Timestamp和Python原生datetime对时区的解析逻辑完全不一样!
先看你贴的代码:
import pandas as pd from datetime import datetime import pytz here = pytz.timezone('Europe/Amsterdam') a = pd.Timestamp('2018-4-9', tz=here).to_pydatetime() # 输出:datetime.datetime(2018, 4, 9, 0, 0, tzinfo=<DstTzInfo'Europe/Amsterdam' CEST+2:00:00 DST>) b = datetime(2018, 4, 9, 0, 0, tzinfo=here) # 输出:datetime.datetime(2018, 4, 9, 0, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' LMT+0:20:00 STD>) print(b-a) # 返回01:40:00
你仔细对比两个对象的tzinfo就能发现问题:
a的时区是CEST+2:00:00 DST,这是阿姆斯特丹对应日期的夏令时标准时区偏移b的时区是LMT+0:20:00 STD,这是该时区历史上的本地平均时间(Local Mean Time)偏移,属于旧时区规则
两者的差异根源:
- Pandas在解析带时区的时间戳时,会自动匹配对应日期的当前/生效时区规则,自动处理夏令时、历史时区变更这类细节
- 而Python原生
datetime直接传入tzinfo=时区对象时,不会智能匹配日期对应的正确偏移,只会使用该时区的初始默认偏移(也就是LMT的+0:20)
如果想让两者相等,别直接给datetime传tzinfo,改用pytz的localize方法:
b = here.localize(datetime(2018, 4, 9, 0, 0)) # 现在b的tzinfo会变成<DstTzInfo 'Europe/Amsterdam' CEST+2:00:00 DST>,和a完全一致 print(b - a) # 会返回00:00:00
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

