pandas.to_datetime转换时间戳出现1小时偏差的问题求助
问题
我使用time.time()记录了带时间戳的数据,希望通过pandas将时间戳转换为datetime对象以便处理,但转换后所有时间数据都偏差了1小时。以下示例可复现该问题:
import datetime as dt import pandas as pd origin = dt.datetime(2024, 1, 15).timestamp() timestamps = [origin + 3600 * i for i in range(10)] print([dt.datetime.fromtimestamp(t).isoformat() for t in timestamps]) print(pd.to_datetime(timestamps, unit='s'))
输出结果:
['2024-01-15T00:00:00', '2024-01-15T01:00:00', '2024-01-15T02:00:00', '2024-01-15T03:00:00', '2024-01-15T04:00:00', '2024-01-15T05:00:00', '2024-01-15T06:00:00', '2024-01-15T07:00:00', '2024-01-15T08:00:00', '2024-01-15T09:00:00'] DatetimeIndex(['2024-01-14 23:00:00', '2024-01-15 00:00:00', '2024-01-15 01:00:00', '2024-01-15 02:00:00', '2024-01-15 03:00:00', '2024-01-15 04:00:00', '2024-01-15 05:00:00', '2024-01-15 06:00:00', '2024-01-15 07:00:00', '2024-01-15 08:00:00'], dtype='datetime64[ns]', freq=None)
我处于UTC+1时区,猜测偏差与时区有关,但不清楚如何处理。希望避免显式指定时区,只想得到与dt.datetime.fromtimestamp()一致的结果,该如何操作?
解决方法
问题根源是pd.to_datetime()默认把时间戳解析为UTC时间,而dt.datetime.fromtimestamp()会自动转换为本地时区时间。要实现一致结果,有两种无需显式指定时区的方法:
方法一:利用datetime.fromtimestamp批量转换
直接用Python标准库的datetime.fromtimestamp对每个时间戳转换,再传入pandas生成时间索引:
import datetime as dt import pandas as pd origin = dt.datetime(2024, 1, 15).timestamp() timestamps = [origin + 3600 * i for i in range(10)] # 批量转换后生成DatetimeIndex pd_dates = pd.DatetimeIndex([dt.datetime.fromtimestamp(t) for t in timestamps]) print(pd_dates)
输出结果与dt.datetime.fromtimestamp()完全一致:
DatetimeIndex(['2024-01-15 00:00:00', '2024-01-15 01:00:00', '2024-01-15 02:00:00', '2024-01-15 03:00:00', '2024-01-15 04:00:00', '2024-01-15 05:00:00', '2024-01-15 06:00:00', '2024-01-15 07:00:00', '2024-01-15 08:00:00', '2024-01-15 09:00:00'], dtype='datetime64[ns]', freq=None)
方法二:使用utc=False参数(Pandas 2.0+支持)
从Pandas 2.0版本开始,pd.to_datetime()新增了utc参数,设置为False会强制解析为本地时区时间,无需手动循环:
import datetime as dt import pandas as pd origin = dt.datetime(2024, 1, 15).timestamp() timestamps = [origin + 3600 * i for i in range(10)] pd_dates = pd.to_datetime(timestamps, unit='s', utc=False) print(pd_dates)
该方法输出结果同样与dt.datetime.fromtimestamp()完全一致,实现更简洁。
内容的提问来源于stack exchange,提问作者schtandard
相关产品推荐
相关产品推荐

