Pandas 基于daterange分解数据帧

Pandas 基于daterange分解数据帧,pandas,python-3.8,Pandas,Python 3.8,我有一个数据帧df如下: Col1 Col2 Col3 StartDate EndDate Qty 24HR A1 B1 1/5/2020 2/28/2020 4.2 asd A2 B2 5/5/2020 7/15/2020 35 我想根据StartDate和EndDate之间的月数重复数据帧的每一行,以获得以下排序: Col1 Col2 Col3 StartDate

我有一个数据帧
df
如下:

Col1    Col2    Col3    StartDate   EndDate     Qty
24HR    A1      B1      1/5/2020    2/28/2020   4.2
asd     A2      B2      5/5/2020    7/15/2020   35
我想根据
StartDate
EndDate
之间的月数重复数据帧的每一行,以获得以下排序:

Col1    Col2    Col3    StartDate   EndDate    Qty
24HR    A1      B1      1/5/2020    1/31/2020   4.2
24HR    A1      B1      2/1/2020    2/28/2020   4.2
asd     A2      B2      5/5/2020    5/31/2020   35
asd     A2      B2      6/1/2020    6/30/2020   35
asd     A2      B2      7/1/2020    7/15/2020   35
我可以使用这种类型的东西,但它符合逻辑:

df.StartDate = df.apply(lambda x: pd.date_range(start=x['StartDate'], end=x['EndDate'], freq='MS'), axis=1)
df = df.explode('StartDate')

我不知道如何处理这个问题。

让我们来做快速修复

df['Date'] = df.apply(lambda x: pd.date_range(start=x['StartDate'], end=x['EndDate'], freq='D'), axis=1)
df=df.explode('Date')
df['Month']=df.Date.dt.strftime('%y-%m')
df=df.groupby(['Col1','Col2','Col3','Qty','Month']).Date.agg(['first','last']).reset_index()
df
   Col1 Col2 Col3   Qty  Month      first       last
0  24HR   A1   B1   4.2  20-01 2020-01-05 2020-01-31
1  24HR   A1   B1   4.2  20-02 2020-02-01 2020-02-28
2   asd   A2   B2  35.0  20-05 2020-05-05 2020-05-31
3   asd   A2   B2  35.0  20-06 2020-06-01 2020-06-30
4   asd   A2   B2  35.0  20-07 2020-07-01 2020-07-15

让我们做快速修复

df['Date'] = df.apply(lambda x: pd.date_range(start=x['StartDate'], end=x['EndDate'], freq='D'), axis=1)
df=df.explode('Date')
df['Month']=df.Date.dt.strftime('%y-%m')
df=df.groupby(['Col1','Col2','Col3','Qty','Month']).Date.agg(['first','last']).reset_index()
df
   Col1 Col2 Col3   Qty  Month      first       last
0  24HR   A1   B1   4.2  20-01 2020-01-05 2020-01-31
1  24HR   A1   B1   4.2  20-02 2020-02-01 2020-02-28
2   asd   A2   B2  35.0  20-05 2020-05-05 2020-05-31
3   asd   A2   B2  35.0  20-06 2020-06-01 2020-06-30
4   asd   A2   B2  35.0  20-07 2020-07-01 2020-07-15

我想你的问题是什么,你有解决办法……它没有给出你想要的答案。选择任何频率都会偏离开始日期或结束日期的要求。我认为这会有帮助。那么,你的问题是什么,你有解决方案。它没有给出想要的答案。:)。选择任何频率都会偏离StartDate或EndDate要求。“.Date.agg(['first','last'])是天才。从来没有想过。”.Date.agg(['first','last'])是天才。我从没想过。