You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:27:34