Python月度数据聚合:合并连续日期行并检测缺失月份
合并连续月度数据并检测日期断层
我有一份包含月度数值的数据集,需要将连续的多行数据合并为一行——判断标准是上一行的End date与下一行的Start date完全一致。如果中间存在日期不连续的情况(即缺失月份),必须能识别出来,不进行合并。
输入示例:
Start date End date Value 1/1/2022 1/31/2022 3 1/31/2022 2/28/2022 4 2/28/2022 3/31/2022 5
输出示例:
Start_date End_date Total_Value 01/01/2022 03/31/2022 12
实现思路
- 转换日期列为
datetime类型,避免字符串比较的误差; - 通过对比当前行
Start date与上一行End date,生成连续数据的分组标识; - 按分组聚合,取每组最早的起始日期、最晚的结束日期,求和数值;
- 加入断层检测逻辑,输出所有日期不连续的位置。
代码实现
import pandas as pd def merge_continuous_monthly_data(df): # 转换日期列为datetime格式 df['Start date'] = pd.to_datetime(df['Start date'], format='%m/%d/%Y') df['End date'] = pd.to_datetime(df['End date'], format='%m/%d/%Y') # 生成连续数据分组:当前行起始日期≠上一行结束日期则新建分组 df['group_id'] = (df['Start date'] != df['End date'].shift(1)).cumsum() # 检测并输出日期断层 gap_rows = df[df['Start date'] != df['End date'].shift(1)].iloc[1:] if not gap_rows.empty: print("检测到日期断层,涉及行:") print(gap_rows[['Start date', 'End date']].to_string(index=False)) # 按分组聚合数据 merged_df = df.groupby('group_id').agg( Start_date=('Start date', 'min'), End_date=('End date', 'max'), Total_Value=('Value', 'sum') ).reset_index(drop=True) # 转换回原始日期字符串格式 merged_df['Start_date'] = merged_df['Start_date'].dt.strftime('%m/%d/%Y') merged_df['End_date'] = merged_df['End_date'].dt.strftime('%m/%d/%Y') return merged_df # 测试示例 test_data = { 'Start date': ['1/1/2022', '1/31/2022', '2/28/2022'], 'End date': ['1/31/2022', '2/28/2022', '3/31/2022'], 'Value': [3, 4, 5] } test_df = pd.DataFrame(test_data) result = merge_continuous_monthly_data(test_df) print("\n合并结果:") print(result.to_string(index=False))
效果说明
- 连续数据会被合并为一行,起始日期取最早值,结束日期取最晚值,数值求和;
- 若存在日期断层(比如某行
Start date≠上一行End date),会主动输出断层位置,且断层前后的数据会分为不同分组,不会被合并。
内容的提问来源于stack exchange,提问作者user19258348
相关产品推荐
相关产品推荐

