如何用Pandas计算分组日期差并标记日期模式?
Pandas实现日期差计算与模式标记
需求回顾
给定包含id和date列的DataFrame,需要新增两列:
day_difference:同一id分组内当前行与上一行的日期天数差,分组首行用_填充Flag:按id的日期间隔模式标记,规则如下:- 仅单条数据:
Single_day - 所有间隔天数固定:
{固定天数}_days_diff - 间隔天数不固定:
No_pattern
- 仅单条数据:
实现步骤与代码
1. 导入依赖并初始化数据
import pandas as pd df_in = pd.DataFrame([["A","2023-02-04"],["A","2023-02-05"],["A","2023-02-06"],["B","2023-02-06"],["B","2023-02-13"],["B","2023-02-20"], ["C","2023-02-07"],["C","2023-02-10"],["C","2023-02-12"],["D","2023-02-14"],["D","2023-02-17"],["D","2023-02-20"], ["E","2023-02-18"]],columns=["id","date"])
2. 转换日期格式并计算day_difference
先把字符串格式的date转为datetime类型,才能进行日期差计算:
# 转换日期列格式 df_in['date'] = pd.to_datetime(df_in['date']) # 按id分组计算日期差,首行NaN替换为"_"并转字符串类型 df_in['day_difference'] = df_in.groupby('id')['date'].diff().dt.days df_in['day_difference'] = df_in['day_difference'].fillna('_').astype(str)
3. 实现Flag列的模式标记
定义分组处理函数,按规则判断每个id的日期模式:
def determine_pattern(group): # 单条数据的情况 if len(group) == 1: return 'Single_day' # 取出分组内所有有效天数差(排除首行的"_") diffs = group[group['day_difference'] != '_']['day_difference'].astype(int) # 检查所有差值是否一致 if diffs.nunique() == 1: return f"{diffs.iloc[0]}_days_diff" else: return 'No_pattern' # 按id分组应用函数,再将结果映射到原DataFrame的每一行 df_in['Flag'] = df_in.groupby('id').apply(determine_pattern).reset_index(drop=True).repeat(df_in.groupby('id').size())
4. 验证结果
执行后df_in即为符合要求的输出,打印查看:
id date day_difference Flag 0 A 2023-02-04 _ 1_days_diff 1 A 2023-02-05 1 1_days_diff 2 A 2023-02-06 1 1_days_diff 3 B 2023-02-06 _ 7_days_diff 4 B 2023-02-13 7 7_days_diff 5 B 2023-02-20 7 7_days_diff 6 C 2023-02-07 _ No_pattern 7 C 2023-02-10 3 No_pattern 8 C 2023-02-12 2 No_pattern 9 D 2023-02-14 _ 3_days_diff 10 D 2023-02-17 3 3_days_diff 11 D 2023-02-20 3 3_days_diff 12 E 2023-02-18 _ Single_day
(注:原预期输出中E的day_difference写为1是笔误,单条数据无前置行,应填充_,上述代码符合逻辑规则)
内容的提问来源于stack exchange,提问作者Chethan
相关产品推荐
相关产品推荐

