为了账号安全,请及时绑定邮箱和手机立即绑定

Python - 锚定日期的日期差异

Python - 锚定日期的日期差异

www说 2023-03-30 10:09:48
我试图找到我的锚定日期和按 ID 分组的其他日期之间的日期差异。输入ID  Date        Anchor Date123 1/5/2018    N123 4/10/2018   N123 5/8/2018    Y123 10/12/2018  N234 1/4/2018    N234 1/4/2018    N234 1/4/2018    Y456 5/6/2018    N456 5/6/2018    N456 5/10/2018   N456 6/1/2018    Y567 3/2/2018    N567 3/2/2018    N567 3/2/2018    Y预期输出:ID  Date        Anchor Date Diff123 1/5/2018    N           -123         123 4/10/2018   N           -28123 5/8/2018    Y            0123 10/12/2018  N            157234 1/4/2018    N            0234 1/4/2018    N            0234 1/4/2018    Y            0456 5/6/2018    N           -26456 5/6/2018    N           -26456 5/10/2018   N           -22456 6/1/2018    Y            0567 3/2/2018    N            0567 3/2/2018    N            0567 3/2/2018    Y            0代码尝试import pandas as pddf = pd.read_csv()df['Date'] = df.groupby('ID')['Date'].apply(lambda x: x.sort_values())df['diff'] = df.groupby('ID')['Date'].diff() / np.timedelta64(1, 'D')df['diff'] = df['diff'].fillna(0)我收到的错误是“插入列的索引与框架索引不兼容”。其次,我不确定如何合并锚定日期列以确保将其用于时间零。
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

首先你需要转换Date成datetime类型:


df['Date'] = pd.to_datetime(df['Date'])

之后,可以提取Anchor Datewith的索引idxmax,然后用于loc提取实际日期:


idx = df['Anchor Date'].eq('Y').groupby(df['ID']).transform('idxmax')

df['Diff'] = (df['Date'] - df.loc[idx, 'Date'].values) / np.timedelta64(1, 'D')

另一种方法是使用布尔索引提取那些日期,然后映射:


anchor_dates = df.loc[df['Anchor Date']=='Y', ['ID','Date']].set_index('ID')['Date']


df['Diff'] = (df['Date'] - anchor_dates)/np.timedelta64(1, 'D')

输出:


     ID       Date Anchor Date   Diff

0   123 2018-01-05           N -123.0

1   123 2018-04-10           N  -28.0

2   123 2018-05-08           Y    0.0

3   123 2018-10-12           N  157.0

4   234 2018-01-04           N    0.0

5   234 2018-01-04           N    0.0

6   234 2018-01-04           Y    0.0

7   456 2018-05-06           N  -26.0

8   456 2018-05-06           N  -26.0

9   456 2018-05-10           N  -22.0

10  456 2018-06-01           Y    0.0

11  567 2018-03-02           N    0.0

12  567 2018-03-02           N    0.0

13  567 2018-03-02           Y    0.0


查看完整回答
反对 回复 2023-03-30
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信