【问题标题】:Group by and calculate date difference with the group, for first row consider first day of the starting year分组并计算与组的日期差异,第一行考虑开始年份的第一天
【发布时间】:2021-04-16 08:42:14
【问题描述】:

我有一个数据框,我需要按类型和年份分组以计算组内的日期差异。

输入

df1 = pd.DataFrame({'type': ['type1', 'type1', 'type1','type1','type1','type3','type3','type3','type3'],
                   'date': ['2017-3-30','2017-5-10','2017-12-15','2018-01-15','2018-05-01','2018-01-30','2018-06-27','2019-03-20','2019-05-21'],
                   'year': [2017, 2017, 2017,2018,2018,2018,2018,2019,2019]})


    type        date  year
0  type1   2017-3-30  2017
1  type1   2017-5-10  2017
2  type1  2017-12-15  2017
3  type1  2018-01-15  2018
4  type1  2018-05-01  2018
5  type3  2018-01-30  2018
6  type3  2018-06-27  2018
7  type3  2019-03-20  2019
8  type3  2019-05-21  2019

我尝试了以下解决方案,它为我提供了行的日期差异,但我想考虑组内第一行的一年中的第一个日期

df1['date'] = pd.to_datetime(df1['date'])
df1['DateDiff'] = df1.groupby(['type','year']).date.diff().fillna(0)

我能够实现以下输出,这并不能解决我需要计算第一行值与一年中第一天的差异的要求。

    type       date  year DateDiff
0  type1 2017-03-30  2017   0 days
1  type1 2017-05-10  2017  41 days
2  type1 2017-12-15  2017 219 days
3  type1 2018-01-15  2018   0 days
4  type1 2018-05-01  2018 106 days
5  type3 2018-01-30  2018   0 days
6  type3 2018-06-27  2018 148 days
7  type3 2019-03-20  2019   0 days
8  type3 2019-05-21  2019  62 days

想要的输出是:

    type       date  year DateDiff
0  type1 2017-03-30  2017  88 days ---- (2017 - 01- 01) - (2017 - 03 - 30)
1  type1 2017-05-10  2017  41 days ---- (2017 - 03 - 30) - (2017-05-10)
2  type1 2017-12-15  2017 219 days
3  type1 2018-01-15  2018   14 days ---- (2018-01-01) - (2018-01-15)
4  type1 2018-05-01  2018 106 days
5  type3 2018-01-30  2018   29 days
6  type3 2018-06-27  2018 148 days
7  type3 2019-03-20  2019   78 days
8  type3 2019-05-21  2019  62 days

【问题讨论】:

  • 如果您同意,请将答案标记为正确,如果有任何遗漏,请发表评论

标签: python dataframe datetime group-by


【解决方案1】:

可能有更优雅的方法,但请在下面找到我的尝试:

import pandas as pd

df = pd.DataFrame({'type': ['type1', 'type1', 'type1','type1','type1','type3','type3','type3','type3'],
                   'date': ['2017-3-30','2017-5-10','2017-12-15','2018-01-15','2018-05-01','2018-01-30','2018-06-27','2019-03-20','2019-05-21'],
                   'year': [2017, 2017, 2017,2018,2018,2018,2018,2019,2019]})

df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(by='date')
result_lst = []
for year_type, sub_df in df.groupby(['year', 'type']):
    year, type = year_type
    sub_df['shift'] = sub_df['date'].shift(1)
    sub_df.loc[sub_df.index[0], 'shift'] = pd.to_datetime(str(year), format='%Y')
    sub_df['DateDiff'] = sub_df['date'] - sub_df['shift']
    sub_df['year'] = year
    sub_df['type'] = type
    sub_df = sub_df.drop(columns=['shift'])
    result_lst.append(sub_df)
df = pd.concat(result_lst, axis=0)
print(df)

结果与您的目标一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多