pandas 展开(不平衡)两个日期之间的行

3z6pesqy  于 2023-01-11  发布在  其他
关注(0)|答案(2)|浏览(136)

我有一个包含每月数据的数据框。示例如下

df = pd.DataFrame({'date': ['2010-02-28', '2010-04-30', '2010-01-31', '2010-03-31'], 'group': ['A', 'A', 'B', 'B']})

我想在每个组的开始日期和结束日期之间插入月份结束日期。问题是每个组都有不同的开始日期和结束日期。
下面是我的尝试。但是,结果具有相同的开始日期和结束日期,并且new_date-group组合不是唯一的。

df['new_date'] = df.apply(lambda x: pd.date_range(start='2010-01-31', end='2010-04-30', freq = 'M'), axis=1)
df = df.explode('new_date').reset_index(drop=True)
ac1kyiln

ac1kyiln1#

您可以在groupby_apply中使用pd.date_range

>>> (df.groupby('group')['date']
       .apply(lambda x: pd.Series(pd.date_range(x.iloc[0], x.iloc[1], freq='M')))
       .droplevel(1).reset_index())

  group       date
0     A 2010-02-28
1     A 2010-03-31
2     A 2010-04-30
3     B 2010-01-31
4     B 2010-02-28
5     B 2010-03-31
klr1opcd

klr1opcd2#

另一种可能的解决方案基于pandas.DataFrame.resample

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

(df.set_index('date')
 .groupby('group', as_index=False)
 .resample('M').asfreq().reset_index()
 .ffill().drop('level_0', axis=1))

输出:

date group
0 2010-02-28     A
1 2010-03-31     A
2 2010-04-30     A
3 2010-01-31     B
4 2010-02-28     B
5 2010-03-31     B

相关问题