python - 计算自上次维护以来的日期差异的有效方法是什么?
问题描述
以下是我正在使用的示例数据集:
maint id
datetime
2015-01-01 1.0 a
2015-01-02 NaN a
2015-01-03 NaN a
2015-01-04 1.0 a
2015-01-05 NaN a
2015-01-06 NaN a
2015-01-07 NaN a
2015-01-01 NaN b
2015-01-02 NaN b
2015-01-03 1.0 b
2015-01-04 1.0 b
2015-01-05 NaN b
2015-01-06 NaN b
2015-01-07 NaN b
我想要得到的是日差,因为df['maint']
是 1。
maint id days
datetime
2015-01-01 1.0 a 0
2015-01-02 NaN a 1
2015-01-03 NaN a 2
2015-01-04 1.0 a 0
2015-01-05 NaN a 1
2015-01-06 NaN a 2
2015-01-07 NaN a 3
2015-01-01 NaN b 0
2015-01-02 NaN b 0
2015-01-03 1.0 b 0
2015-01-04 1.0 b 0
2015-01-05 NaN b 1
2015-01-06 NaN b 2
2015-01-07 NaN b 3
因为我有几千个不同的ID,每个ID都有几年的维护记录。我想找到一种计算日差的有效方法。
解决方案
利用:
df['days'] = df.index.where(df['maint'].eq(1))
df['days'] = (df.index - df.groupby('id')['days'].ffill()).fillna(pd.Timedelta(0)).dt.days
print (df)
maint id days
datetime
2015-01-01 1.0 a 0
2015-01-02 NaN a 1
2015-01-03 NaN a 2
2015-01-04 1.0 a 0
2015-01-05 NaN a 1
2015-01-06 NaN a 2
2015-01-07 NaN a 3
2015-01-01 NaN b 0
2015-01-02 NaN b 0
2015-01-03 1.0 b 0
2015-01-04 1.0 b 0
2015-01-05 NaN b 1
2015-01-06 NaN b 2
2015-01-07 NaN b 3
说明:
- 首先创建新列
days
,其值为df.index
wheremaint
is1
,另一个值为NaT
- 减去
index
由创建的新系列GroupBy.ffill
,将NaN
s 替换为0 timedelta
并最后将它们转换为天数Series.dt.days
推荐阅读
- c# - 了解 ADO.NET 的“连接生命周期”
- java - 无法使用 spring kafka 生产者向 Kafka 发送任何消息 - 超时异常
- sql - Redshift 中的溢出错误
- excel - 宏 Excel:检查单元格是否为空
- javascript - 承诺功能无法识别外部变量
- rust - 为什么 Rust 找不到 wl_display_get_registry?
- python - 如何返回 JSON 请求输入并在另一个函数中使用它?
- python - 有没有更短的方法可以通过列表来实现?
- python - 无头 Chrome 浏览器 - 使用 Selenium 和 ChromeDriver
- c++ - 在 boost 中覆盖验证方法不适用于样式集