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

如何用Pandas计算分组日期差并标记日期模式?

Pandas实现日期差计算与模式标记

需求回顾

给定包含id和date列的DataFrame,需要新增两列:

  1. day_difference:同一id分组内当前行与上一行的日期天数差,分组首行用_填充
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:57:45