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

如何为Pandas DataFrame.resample()设置基于UNIX纪元的时间偏移?

解决Pandas resample按固定周期(如30天)从UNIX纪元对齐的问题

当使用resample()处理30D这类非日历对齐的频率时,默认行为是以数据中的第一个时间戳为起点划分周期,这会导致后续用pd.Timestamp.floor('30D')得到的分组标签和resample结果不匹配——因为floor()是从UNIX纪元(1970-01-01 00:00:00 UTC)开始计算周期的。

核心解决方案:指定origin='epoch'参数

Pandas的resample()方法提供了origin参数,直接设置为'epoch'就能让所有周期从UNIX纪元开始对齐,和floor()的计算逻辑保持一致。

代码示例验证

import pandas as pd
import numpy as np

# 构造测试数据:时间范围覆盖多个30天周期
dates = pd.date_range(start='2023-02-15', end='2023-05-20', freq='D')
df = pd.DataFrame({'value': np.random.randn(len(dates))}, index=dates)

# 错误示例:默认resample(以数据首个时间戳为起点)
resampled_default = df.resample('30D').sum()
print("默认resample的周期索引:")
print(resampled_default.index)

# 正确示例:指定origin='epoch',从UNIX纪元开始对齐
resampled_epoch = df.resample('30D', origin='epoch').sum()
print("\n按UNIX纪元对齐的resample周期索引:")
print(resampled_epoch.index)

# 验证和floor结果匹配
sample_ts = pd.Timestamp('2023-03-20')
print(f"\n时间{sample_ts}的floor('30D')结果:{sample_ts.floor('30D')}")
# 该结果会和resampled_epoch中对应的周期起始时间一致

关键说明

  • origin='epoch'是Pandas 1.1.0及以上版本支持的参数,确保你的Pandas版本符合要求。
  • 除了'epoch',origin还支持传入具体时间戳(如pd.Timestamp('1970-01-01')),效果和'epoch'一致,但使用'epoch'更简洁。
  • 这样设置后,resample生成的每个周期起始时间,都会和对应时间戳floor('30D')的结果完全匹配,避免分组标签不一致的问题。

内容的提问来源于stack exchange,提问作者Mikko Ohtamaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:39:19