如何按6个月日期周期拆分带日期索引的Pandas DataFrame
Pandas 按固定6个月周期拆分Datetime索引DataFrame方案
核心实现步骤
- 首先确保DataFrame的索引为DatetimeIndex类型:
import pandas as pd # 非DatetimeIndex先做转换 df.index = pd.to_datetime(df.index)
- 生成间隔6个月的时间切割区间:
start_date = pd.to_datetime("2010-10-18") # 动态计算需要的切割点数量,覆盖所有数据范围 total_months = (df.index.max() - start_date).days // 30 + 1 bin_count = total_months // 6 + 2 date_bins = pd.DatetimeIndex([start_date + pd.DateOffset(months=6*i) for i in range(bin_count)])
- 打周期标签并拆分出子DataFrame:
# 给每行数据分配所属周期 df["period_tag"] = pd.cut( df.index, bins=date_bins, labels=[f"period_{i+1}" for i in range(len(date_bins)-1)], include_lowest=True ) # 拆分结果存为字典,key为周期名,value为对应子DataFrame period_df_dict = { period_name: group.drop("period_tag", axis=1) for period_name, group in df.groupby("period_tag", observed=True) }
调用方式
直接通过字典读取对应周期的子DataFrame即可,示例:
# 读取第一个周期数据 period_1 = period_df_dict["period_1"] # 读取第二个周期数据 period_2 = period_df_dict["period_2"]
如果需要直接生成period_1、period_2这类全局变量,可以追加以下代码(更推荐用字典存储,维护成本更低):
for period_name, period_df in period_df_dict.items(): globals()[period_name] = period_df
补充说明
- 示例代码是严格按照「起始日+N个6个月」作为区间边界,比如period_1的区间为
2010-10-18到2011-04-18,符合对周期边界的要求。 - 如果需要调整为自然月首日作为边界,只需把生成
date_bins的代码替换为date_bins = pd.date_range(start=start_date, end=df.index.max(), freq="6MS")即可。
内容的提问来源于stack exchange,提问作者Deng-guy
相关产品推荐
相关产品推荐

