python - 行之间的熊猫日期时间增量按另一列分组
问题描述
当它按熊猫数据帧中的特定列分组时,我正在尝试计算行之间的时间差(以天为单位)。仅当没有分组依据时,日期差异才有效。如何应用分组依据并计算行之间的日期差异?在它下面也给了我相反的结果,但我想从下到上计算时差。我错过了什么?这是我到目前为止所尝试的。
.csv 文件示例
group_id,code,date,number
123,abc,2021-02-18,4
123,def,2020-11-11,3
123,ghi,2020-11-10,2
123,jkl,2020-10-01,1
456,gtg,2020-11-28,5
456,abd,2020-10-30,4
456,def,2020-10-05,3
456,jkl,2020-10-01,2
456,uuu,2020-10-01,1
我的代码:
df = pd.read_csv('../sample/sample.csv')
print(df)
df['date'] = pd.to_datetime(df['date']) # convert date type
尝试#1:有效但未分组并从顶行到底行计算。
df['deltaT'] = (df['date'].shift()-df['date'])
尝试#2:错误
df['group_id'].shift().where(df['date'].shift()-df['date']) # ValueError: Boolean array expected for the condition, not object
我试图得到这个结果:
group_id,code,date,number, deltaT
123,abc,2021-02-18,4, 99 days
123,def,2020-11-11,3, 1 days
123,ghi,2020-11-10,2, 40 days
123,jkl,2020-10-01,1, 0
456,gtg,2020-11-28,5, 29 days
456,abd,2020-10-30,4, 25 days
456,def,2020-10-05,3, 4 days
456,jkl,2020-10-01,2, 0 days
456,uuu,2020-10-01,1, 0
解决方案
尝试这个 -
(df.groupby(['group_id'])['date'].shift() - df['date']).shift(-1)
0 99 days
1 1 days
2 40 days
3 NaT
4 29 days
5 25 days
6 4 days
7 0 days
8 NaT
Name: date, dtype: timedelta64[ns]
因此,您可以直接.shift()
在 grouper 对象的日期列上使用,将每个组的日期移动 1,然后从中减去原始日期。
- 最后的
.shift(-1)
(反向移位)只是为了使结果与您在上面的问题中如何构建它的预期输出保持一致。如果不需要,您可以安全地删除它。 - 此外,如果您需要将
NaT
值替换为 0,您可以使用.shift(fill_value=0)
您正在使用的两个班次。
注意:由于您要从组移位的日期中减去原始日期,请确保数据按(组,日期)排序,否则可能会导致不良结果!
推荐阅读
- sql - 无法绑定多部分标识符“MyNewDatabase.dbo.df_umts_relation.technology”
- sql - SQL根据日期合并值并添加结果列
- laravel - 如何在 laravel 中集成 tinymce vue 组件
- java - Java:从 ResultSet 中检索列名
- amazon-redshift - 如何找出 redshift 中止查询的原因?
- c++ - va_arg 会在 clang 和 apple mac os x 中溢出吗?
- c++ - 您如何为标准库容器定义 C++ 概念?
- eclipse - 配置 Maven 项目以通过代理工作
- mysql - Laravel 子查询
- c# - DataGridView 中的更新行未反映在 UI C# WinForms 中