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

在Pandas中新增time_1、time_2列计算距对应上一次事件的时间间隔

解决MultiIndex DataFrame中上次事件时间间隔计算问题

嘿,我来帮你搞定这个需求!针对你的带ID和date多级索引的DataFrame,我们可以通过Pandas的分组和向前填充技巧,轻松计算出每一行距离上一次event_1、event_2发生的时间间隔。

步骤1:还原你的数据结构

首先我们把你给出的示例数据转换成标准的Pandas DataFrame:

import pandas as pd

# 构造示例数据
data = {
    'ID': [1, 1, 1, 2, 2, 2, 2, 2],
    'date': ['2016-01-03', '2016-02-07', '2016-02-18',
             '2016-01-01', '2016-01-04', '2016-02-02', '2016-02-04', '2016-02-05'],
    'event_1': [False, True, False, False, False, True, False, False],
    'event_2': [False, False, True, True, False, False, False, True]
}

# 转换日期格式并设置多级索引
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df = df.set_index(['ID', 'date'])

步骤2:核心计算逻辑

我们定义一个自定义函数,按ID分组后,对每个用户的事件时间进行独立处理:

def calculate_time_since_last_event(group, event_col):
    # 筛选出当前事件发生的日期,用向前填充把事件日期传递到后续所有行
    last_event_dates = group[event_col].where(group[event_col]).ffill()
    # 计算当前日期与上次事件日期的时间间隔
    return group.index.get_level_values('date') - last_event_dates

# 为每个ID计算time_1和time_2
df['time_1'] = df.groupby('ID').apply(calculate_time_since_last_event, event_col='event_1').droplevel(0)
df['time_2'] = df.groupby('ID').apply(calculate_time_since_last_event, event_col='event_2').droplevel(0)

# 可选:将Timedelta类型转换成天数(如果需要数值型结果)
df['time_1'] = df['time_1'].dt.days
df['time_2'] = df['time_2'].dt.days

最终结果

运行后得到的DataFrame如下:

event_1  event_2  time_1  time_2
ID date                                              
1  2016-01-03        False    False     NaN     NaN
   2016-02-07         True    False     NaN     NaN
   2016-02-18        False     True    11.0     NaN
2  2016-01-01        False     True     NaN     NaN
   2016-01-04        False    False     NaN     3.0
   2016-02-02         True    False     NaN    32.0
   2016-02-04        False    False     2.0    34.0
   2016-02-05        False     True     3.0     0.0

小提示

  • 对于首次出现事件的行(比如ID=1的2016-02-07,event_1第一次为True),因为没有之前的事件记录,时间间隔会是NaN,你可以根据业务需求用df['time_1'].fillna(0)或者其他值替换。
  • 如果不需要转换成天数,直接保留Timedelta类型也可以,方便后续的时间运算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:53:31