首页 > 解决方案 > 组 连续范围日期

问题描述

我有一个看起来像这样的熊猫数据框:

   KEY      START        END
0    A 2021-01-01 2021-01-31
1    A 2021-01-15 2021-01-18
2    A 2021-01-03 2021-02-15
3    A 2021-03-01 2021-03-31
4    A 2021-04-01 2021-04-15
5    A 2021-04-16 2021-04-30
6    B 2021-01-02 2021-01-05
7    B 2021-01-01 2021-01-10
8    B 2021-01-15 2021-01-20
9    B 2021-01-19 2021-01-31
10   B 2021-03-01 2021-03-31

我想按 KEY 和连续/包含期间分组。例如在上面的例子中,我想得到:

  KEY      START        END
0   A 2021-01-01 2021-02-15
1   A 2021-03-01 2021-04-30
2   B 2021-01-01 2021-01-10
3   B 2021-01-15 2021-01-31
4   B 2021-03-01 2021-03-31

问候

标签: pythonpandasdataframe

解决方案


这里有一些可以使用的想法。我没有时间全力以赴,但我想我会与你分享一些可能会让你滚动的想法。(也许以后)

现在只选择“B”键:(确保 START 和 END 是日期时间)

dfB = df[df['KEY']=='B'].copy()

创建日期范围:

dfB['Range'] = dfB.apply(lambda x: pd.date_range(start=x['START'], end=x['END']), axis=1)

创建一个包含所有不同日期的 DatetimeIndex:

dti = dfB['Range'].iloc[0].union_many(dfB['Range'][1:])
dti

DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
               '2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08',
               '2021-01-09', '2021-01-10', '2021-01-15', '2021-01-16',
               '2021-01-17', '2021-01-18', '2021-01-19', '2021-01-20',
               '2021-01-21', '2021-01-22', '2021-01-23', '2021-01-24',
               '2021-01-25', '2021-01-26', '2021-01-27', '2021-01-28',
               '2021-01-29', '2021-01-30', '2021-01-31', '2021-03-01',
               '2021-03-02', '2021-03-03', '2021-03-04', '2021-03-05',
               '2021-03-06', '2021-03-07', '2021-03-08', '2021-03-09',
               '2021-03-10', '2021-03-11', '2021-03-12', '2021-03-13',
               '2021-03-14', '2021-03-15', '2021-03-16', '2021-03-17',
               '2021-03-18', '2021-03-19', '2021-03-20', '2021-03-21',
               '2021-03-22', '2021-03-23', '2021-03-24', '2021-03-25',
               '2021-03-26', '2021-03-27', '2021-03-28', '2021-03-29',
               '2021-03-30', '2021-03-31'],
              dtype='datetime64[ns]', freq=None)

现在找到大于 1 的连续天间隔。结果包含 DatetimeIndex 中范围的起始天数。唯一缺少的开始日期是系列中的第一个日期。

dti[pd.Series(dti).diff().dt.days>1]

DatetimeIndex(['2021-01-15', '2021-03-01'], dtype='datetime64[ns]', freq=None)

您仍然需要弄清楚如何将其转换为具有开始日期和结束日期的 DF。由于groupby. 也许在一个apply函数中。(这就是为什么我只选择 KEY 'B' 开始)

我想给你半个答案总比什么都没有好。


推荐阅读