首页 > 解决方案 > 如何使用熊猫将行的开始日期和结束日期转换为每月块?

问题描述

这是我拥有的数据集

  id      start        end
0  A   1-Jan-19  31-Dec-19
1  A   1-Jan-20  31-Dec-20
2  B  13-Jun-19  19-Nov-19
df = pd.DataFrame({'id': ["A", "A", "B"],
           'start': ["1-Jan-19", "1-Jan-20", "13-Jun-19"],
           'end': ["31-Dec-19", "31-Dec-20", "19-Nov-19"]})

这是我需要的数据集

   id      start        end
0   A   1-Jan-19  31-Jan-19
1   A   1-Feb-19  28-Feb-19
2   A   1-Mar-19  31-Mar-19
3   A   1-Apr-19  30-Apr-19
4   A   1-May-19  31-May-19
5   A   1-Jun-19  30-Jun-19
6   A   1-Jul-19  31-Jul-19
7   A   1-Aug-19  31-Aug-19
8   A   1-Sep-19  30-Sep-19
9   A   1-Oct-19  31-Oct-19
10  A   1-Nov-19  30-Nov-19
11  A   1-Dec-19  31-Dec-19
12  B  13-Jun-19  30-Jun-19
13  B   1-Jul-19  31-Jul-19
14  B   1-Aug-19  31-Aug-19
15  B   1-Sep-19  30-Sep-19
16  B   1-Oct-19  31-Oct-19
17  B   1-Nov-19  19-Nov-19

数据按 id 分组,时间块分布在几个月中。我尝试使用 resample 和 bfill Pandas 方法没有成功。是否可以使用 Pandas 执行此操作,或者我是否需要通过对日期系列进行合并并过滤日期重叠的位置来解决方法?

谢谢

标签: pythonpandastime-series

解决方案


这是解决方案。

from dateutil.relativedelta import relativedelta
import pandas as pd
import numpy as np

df1 = pd.DataFrame({'id': ["A", "A", "B"],
           'start': ["1-Jan-19", "1-Jan-20", "13-Jun-19"],
           'end': ["31-Dec-19", "31-Dec-20", "19-Nov-19"]})

df1["start"] = df1["start"].apply(lambda x: datetime.strptime(x, "%d-%b-%y") )
df1["end"] = df1["end"].apply(lambda x: datetime.strptime(x, "%d-%b-%y") )
df1["rows"] = abs((df1["start"]-df1["end"])/np.timedelta64(1,'M')).astype(int)
df_new = pd.DataFrame([df1.ix[idx] 
                       for idx in df1.index 
                       for i in range(df1.ix[idx]['rows'] +1)])
df_new = df_new.reset_index(drop=True)
groups = df_new.groupby(["start", "end"],as_index = False)
grouped_df = groups.apply(lambda x: x.reset_index(drop = True)).reset_index().drop('level_0',axis = 1)
grouped_df["start"] =grouped_df.apply(lambda row : row["start"]+  relativedelta(months=row["level_1"]), axis =1)
grouped_df.drop(['level_1', 'rows'], axis =1 ,inplace = True)
grouped_df

我假设您跳过了第二个输入行的处理。
如果不是这种情况,请告诉我。

输入:

在此处输入图像描述

输出 :

[1]:https://i.stack.imgur.com/JKfXz.png


推荐阅读