繁体   English   中英

pandas 将两个日期之间的月份添加为新行

[英]pandas add the months between two dates as a new rows

我有一个这样的 dataframe:

import pandas as pd
data=[[1,'2021-10-01 00:00:00','2021-12-01 23:59:59'],[2,'2022-02-01 00:00:00','2022-05-10 23:59:59']]
df=pd.DataFrame(data,columns=['id','start_date','end_date'])
df

id  start_date           end_date
1   2021-10-01 00:00:00  2021-12-01 23:59:59
2   2022-02-01 00:00:00  2022-05-10 23:59:59

我想在新列中获取开始日期和结束日期之间的月份。

预计 output:

data2=[[1,'2021-10-01 00:00:00','2021-12-01 23:59:59','2021-10'],
       [1,'2021-10-01 00:00:00','2021-12-01 23:59:59','2021-11'],
       [1,'2021-10-01 00:00:00','2021-12-01 23:59:59','2021-12'],
       [2,'2022-02-01 00:00:00','2022-05-10 23:59:59','2022-02'],
       [2,'2022-02-01 00:00:00','2022-05-10 23:59:59','2022-03'],
       [2,'2022-02-01 00:00:00','2022-05-10 23:59:59','2022-04'],
       [2,'2022-02-01 00:00:00','2022-05-10 23:59:59','2022-05']]
df2=pd.DataFrame(data2,columns=['id','start_date','end_date','months'])
df2

id  start_date            end_date             months
1   2021-10-01 00:00:00   2021-12-01 23:59:59  2021-10
1   2021-10-01 00:00:00   2021-12-01 23:59:59  2021-11
1   2021-10-01 00:00:00   2021-12-01 23:59:59  2021-12
2   2022-02-01 00:00:00   2022-05-10 23:59:59  2022-02
2   2022-02-01 00:00:00   2022-05-10 23:59:59  2022-03
2   2022-02-01 00:00:00   2022-05-10 23:59:59  2022-04
2   2022-02-01 00:00:00   2022-05-10 23:59:59  2022-05

有没有办法做到这一点?

period_range创建月份周期,然后使用DataFrame.explode

df['months'] = [pd.period_range(s, e, freq='m') 
                                        for s, e in zip(df['start_date'], df['end_date'])]

#alternative
#lambda x: pd.period_range(x['start_date'], x['end_date'], freq='m')
#df['months'] = df.apply(f, axis=1)

df = df.explode('months').reset_index(drop=True)
print (df)
   id           start_date             end_date   months
0   1  2021-10-01 00:00:00  2021-12-01 23:59:59  2021-10
1   1  2021-10-01 00:00:00  2021-12-01 23:59:59  2021-11
2   1  2021-10-01 00:00:00  2021-12-01 23:59:59  2021-12
3   2  2022-02-01 00:00:00  2022-05-10 23:59:59  2022-02
4   2  2022-02-01 00:00:00  2022-05-10 23:59:59  2022-03
5   2  2022-02-01 00:00:00  2022-05-10 23:59:59  2022-04
6   2  2022-02-01 00:00:00  2022-05-10 23:59:59  2022-05

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM