如何计算自上次事件==1 以来的天数?

Posted

技术标签:

【中文标题】如何计算自上次事件==1 以来的天数?【英文标题】:How to calculate the number of days since last event==1? 【发布时间】:2019-08-16 13:28:01 【问题描述】:

我正在做一个分类问题,我试图预测汽车是否会在第二天加油。

数据包含日期、每辆汽车的 ID 以及指示汽车是否在该特定日期加油的虚拟变量。

我想要实现的是“days_since_refuelled”列。这应该计算为自上次出现 refueled==1 以来的天数,并且显然必须为每个 car_id 单独计算。如果之前没有 refuelled==1 的实例,则该值应等于 -1。

所需的输出应如下所示:

date    car_id     refuelled    days_since_refuelled

01-01-2019    1    0    -1

01-01-2019    2    1    -1

01-01-2019    3    1    -1

06-01-2019    1    0    -1

06-01-2019    2    0    5

06-01-2019    3    0    5

09-01-2019    1    1    -1

09-01-2019    2    0    8

09-01-2019    3    0    8

14-01-2019    1    0    5

14-01-2019    2    1    13

14-01-2019    3    0    13

【问题讨论】:

您能否展示一下您对此问题的尝试或思路? 我正在寻找一个函数/循环来回答以下问题:“对于这个 car_id,它从加油到现在还有多少天?”。我希望这是有道理的。 【参考方案1】:

1 的行转换为NaNs 通过Series.where,然后Series.shiftffill 每组,然后用Series.sub 减去date 列,最后通过Series.dt.days 转换timedeltas 并替换Series.fillna 的缺失值:

#convert to datetimes
df['date'] = pd.to_datetime(df['date'], dayfirst=True)

df['days_since_refuelled'] = df['date'].where(df['refuelled'].eq(1))
df['days_since_refuelled'] = (df['date'].sub(df.groupby('car_id')['days_since_refuelled']
                                        .apply(lambda x: x.shift().ffill())
                                        )
                                        .dt.days
                                        .fillna(-1)
                                        .astype(int))
print (df)
         date  car_id  refuelled  days_since_refulled  days_since_refuelled
0  2009-01-01       1          0                   -1                    -1
1  2019-01-01       2          1                   -1                    -1
2  2019-01-01       3          1                   -1                    -1
3  2019-01-06       1          0                   -1                    -1
4  2019-01-06       2          0                    5                     5
5  2019-01-06       3          0                    5                     5
6  2019-01-09       1          1                   -1                    -1
7  2019-01-09       2          0                    8                     8
8  2019-01-09       3          0                    8                     8
9  2019-01-14       1          0                    5                     5
10 2019-01-14       2          1                   13                    13
11 2019-01-14       3          0                   13                    13

【讨论】:

以上是关于如何计算自上次事件==1 以来的天数?的主要内容,如果未能解决你的问题,请参考以下文章

Google表格 - 自上次日期以来的天数一系列单元格

自上次活动以来经过的代码天数

获取自上次增加 Prometheus 计数器以来经过的时间

如何计算自特定列中发生事件以来经过的时间 - Pandas DataFrames

熊猫:自某个日期以来经过的天数

VB - 检索自上次更改以来对 .txt 文件的新增内容