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

Pandas日期时间转换不一致:为何转换结果不符合预期?

问题原因分析

这个问题的核心是时区处理的不一致,咱们一步步拆解清楚:

  1. 你用pd.datetime(now.year, now.month, now.day, 0)创建的start_of_today是一个无时区信息(naive)的datetime对象,它默认对应你当前系统的本地时区时间(比如你的系统时区是UTC+2的话,这个时间就是本地的2018-04-09 00:00)。
  2. 当你调用.timestamp()方法时,Python会把这个naive datetime当作本地时区的时间,转换为从1970-01-01 UTC开始计算的Unix时间戳。也就是说,本地时间的2018-04-09 00:00对应的UTC时间是2018-04-08 22:00(如果你的时区是UTC+2),所以这个时间戳实际上对应UTC的前一天22点。
  3. 最后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:35:43