pandas.Timestamp.floor对不同时间戳返回不同结果的原因排查
Pandas 1.5.0中48小时向下取整结果不一致的原因
你在Pandas 1.5.0中执行以下代码时,发现两个时间戳的48小时向下取整结果不一致:
import pandas as pd def test(now): now = pd.Timestamp(now) interval = pd.Timedelta("48 hours") floored = now.floor(interval) diff = now - floored print(f"{now}, {interval}, {floored}, {diff}") test('2023-10-18 23:59:03.793642') test('2023-10-11 23:59:03.793642')
输出结果:
2023-10-18 23:59:03.793642, 48 hours, 2023-10-18 00:00:00, 0 days 23:59:03.793642 2023-10-11 23:59:03.793642, 48 hours, 2023-10-10 00:00:00, 1 days 23:59:03.793642
原因分析
这个差异的核心是Pandas 1.5.0中使用Timedelta作为floor()的频率参数时,是从Unix纪元(1970-01-01 00:00:00 UTC)开始计算间隔周期,而非以目标日期的自然日为起点:
- 对于
2023-10-18 00:00:00,它与纪元的时间差恰好是48小时的整数倍。因此2023-10-18 23:59:03向下取整时,最近的符合条件的时间点就是当天0点。 - 对于
2023-10-11 00:00:00,它与纪元的时间差不是48小时的整数倍,最近的符合条件的时间点是2023-10-10 00:00:00(该点与纪元的时间差是48小时的整数倍),因此取整结果为这个时间点。
解决方案
如果你需要基于自然日的48小时间隔(比如从偶数日/奇数日0点开始计算周期),可以改用2D频率参数直接取整:
# 使用自然日的48小时间隔(2天) floored = now.floor('2D')
内容的提问来源于stack exchange,提问作者Steve Lorimer
相关产品推荐
相关产品推荐

