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

为Pandas DataFrame按num_ID添加基于日期差阈值的total_times列

Pandas分组计算日期间隔标记列

原始DataFrame

num_IDstart_dateend_dateother_column
12022-02-142022-02-1509:23:00
12022-02-202022-02-2512:10:01
22022-03-112022-03-2108:21:00
22022-03-222022-03-2702:36:00
22022-04-102022-04-1511:43:03
32022-02-042022-02-0616:51:00
32022-02-142022-02-2319:35:10
42022-02-282022-10-1200:01:00

需求

  • 新增一列total_times
  • 按num_ID分组,每个分组的首行total_times设为0
  • 其余行判断:同分组上一行的end_date与当前行start_date间隔是否≥7天,是则设为1,否则设为0

中间状态示例

num_IDstart_dateend_dateother_columntotal_times
12022-02-142022-02-1509:23:000
12022-02-202022-02-2512:10:01
22022-03-112022-03-2108:21:000
22022-03-222022-03-2702:36:00
22022-04-102022-04-1511:43:03
32022-02-042022-02-0616:51:000
32022-02-142022-02-2319:35:10
42022-02-282022-10-1200:01:000

最终结果示例

num_IDstart_dateend_dateother_columntotal_times
12022-02-142022-02-1509:23:000
12022-02-202022-02-2512:10:010
22022-03-112022-03-2108:21:000
22022-03-222022-03-2702:36:000
22022-04-102022-04-1511:43:031
32022-02-042022-02-0616:51:000
32022-02-142022-02-2319:35:101
42022-02-282022-10-1200:01:000

解决方案代码

import pandas as pd

# 构造原始数据
data = {
    'num_ID': [1,1,2,2,2,3,3,4],
    'start_date': ['2022-02-14','2022-02-20','2022-03-11','2022-03-22','2022-04-10','2022-02-04','2022-02-14','2022-02-28'],
    'end_date': ['2022-02-15','2022-02-25','2022-03-21','2022-03-27','2022-04-15','2022-02-06','2022-02-23','2022-10-12'],
    'other_column': ['09:23:00','12:10:01','08:21:00','02:36:00','11:43:03','16:51:00','19:35:10','00:01:00']
}
df = pd.DataFrame(data)

# 转换日期列为datetime类型
df['start_date'] = pd.to_datetime(df['start_date'])
df['end_date'] = pd.to_datetime(df['end_date'])

# 分组处理,计算间隔并生成total_times
df['total_times'] = df.groupby('num_ID').apply(
    lambda x: pd.Series([0] + [(x['start_date'].iloc[i] - x['end_date'].iloc[i-1]).days >=7 for i in range(1, len(x))])
).reset_index(drop=True)

print(df)

代码解释

  1. 日期类型转换:将start_date和end_date转为datetime类型,确保能正确计算日期差
  2. 分组逻辑处理:按num_ID分组后,对每个分组单独操作:
    • 首行直接赋值0
    • 从第二行开始,计算当前行起始日期与上一行结束日期的天数差,判断是否≥7,返回1或0
  3. 结果整合:将分组处理后的结果重置索引,赋值给新列total_times

内容的提问来源于stack exchange,提问作者Carola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:25:38