Pandas日期时间转换不一致:为何转换结果不符合预期?
问题原因分析
这个问题的核心是时区处理的不一致,咱们一步步拆解清楚:
- 你用
pd.datetime(now.year, now.month, now.day, 0)创建的start_of_today是一个无时区信息(naive)的datetime对象,它默认对应你当前系统的本地时区时间(比如你的系统时区是UTC+2的话,这个时间就是本地的2018-04-09 00:00)。 - 当你调用
.timestamp()方法时,Python会把这个naive datetime当作本地时区的时间,转换为从1970-01-01 UTC开始计算的Unix时间戳。也就是说,本地时间的2018-04-09 00:00对应的UTC时间是2018-04-08 22:00(如果你的时区是UTC+2),所以这个时间戳实际上对应UTC的前一天22点。 - 最后
pd.to_datetime(..., unit='s')默认会把这个时间戳解析为UTC时区的时间,所以输出的就是UTC的2018-04-08 22:00:00,而不是你预期的本地时区的00:00。
修复方案
这里有两种简单的解决思路,也给你提供更简洁的替代写法:
思路1:让start_of_today带有时区信息
直接创建带明确时区的datetime对象,从根源避免时区歧义:
import pandas as pd from datetime import timezone now = pd.Timestamp('2018-04-09 09:10') # 创建带本地时区的当天0点 start_of_today = pd.Timestamp(now.year, now.month, now.day, 0, tz=now.tz or 'local') # 解析时同步指定时区 print(pd.to_datetime(start_of_today.timestamp(), unit='s', tz=start_of_today.tz))
思路2:解析时间戳时指定本地时区
如果坚持用naive datetime,在pd.to_datetime时把解析后的UTC时间转换为本地时区:
import pandas as pd now = pd.Timestamp('2018-04-09 09:10') start_of_today = pd.datetime(now.year, now.month, now.day, 0) # 先解析为UTC,再转换到本地时区 print(pd.to_datetime(start_of_today.timestamp(), unit='s').tz_localize('UTC').tz_convert('local'))
更简洁的替代写法
其实完全不需要绕时间戳,直接用pandas的内置方法就能获取当天0点:
import pandas as pd now = pd.Timestamp('2018-04-09 09:10') start_of_today = now.floor('D') print(start_of_today)
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

