如何使用pandas.offsets.MonthBegin获取时间戳所在月的月初时刻
问题解答
a. 更简洁的实现方式
直接用 pandas 内置的周期转换接口即可一步得到结果:
# 列表推导写法 result = [ts.to_period('M').start_time for ts in stamps] # 矢量化批量处理写法(适合数据量较大的场景) import pandas as pd stamp_series = pd.Series(stamps) result = stamp_series.dt.to_period('M').dt.start_time
上述代码会直接输出你需要的当月月初零点结果,不需要多次叠加偏移量,时区信息也会完整保留。
b. MonthBegin的行为说明
你观察到的是MonthBegin的设计预期行为,并非bug。MonthBegin属于pandas的锚定偏移类,核心逻辑是:
- 给时间戳加偏移量时,默认向「未来方向」对齐到最近的月初锚点
- 参数
n代表对齐后再跳转的月初次数:- 用
n=0时:如果当前日期不是当月1号,会直接对齐到下一个月的月初,这就是1月27号的时间戳得到2月结果的原因 - 用
n=1时:不管当前是不是月初,都会对齐到下一个月的月初,所以三个测试用例全部得到2月结果
- 用
如果一定要用MonthBegin实现需求,可以用它内置的rollback方法向前对齐,写法也比两次叠加偏移简单:
result = [pd.offsets.MonthBegin().rollback(ts.floor('D')) for ts in stamps]
内容的提问来源于stack exchange,提问作者ElRudi
相关产品推荐
相关产品推荐

