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

为什么pd.Timestamp.floor()未向下取整反而向上取整?

pd.Timestamp.floor() 异常向上取整问题解答

核心原因

你观察到的异常取整结果和pd.Timestamp.floor()本身的向下取整逻辑无关,是pytz时区初始化不规范导致的时间偏移偏差引发的:

  • 直接用pytz.timezone("America/New_York")给datetime.time对象绑定时区时,pytz默认返回的是该地区的*本地平均时间(LMT)*偏移,而非对应日期的法定时区偏移。你打印pd.Timestamp(dt)得到的-04:56就是纽约历史上使用的LMT偏移,并非2021年纽约夏令时对应的-04:00法定偏移。
  • 调用floor(freq='H')时,pandas会自动将时间转换为对应时区的法定偏移时间:原始的2021-07-03 09:30:00-04:56转换为UTC-4偏移后,对应时间为2021-07-03 10:26:00-04:00,此时对小时向下取整,自然得到2021-07-03 10:00:00-0400的结果。

正确实现方式

pytz的标准用法是使用localize方法给完整的无时区datetime对象绑定时区,不要单独给datetime.time对象赋时区:

import datetime
import pytz
import pandas as pd

# 先构造无时区的完整datetime
naive_dt = datetime.datetime(2021,7,3,8,0,0) + datetime.timedelta(hours=1, minutes=30)
# 用localize绑定对应日期的法定时区
tz = pytz.timezone("America/New_York")
dt = tz.localize(naive_dt)

# 输出:2021-07-03 09:30:00-04:00,时区偏移符合预期
print(pd.Timestamp(dt))
# 输出:Timestamp('2021-07-03 09:00:00-0400', tz='America/New_York'),取整结果正确
print(pd.Timestamp(dt).floor(freq='H'))

内容的提问来源于stack exchange,提问作者1step1leap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:36:03