python - 组 连续范围日期
问题描述
我有一个看起来像这样的熊猫数据框:
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
问候
解决方案
这里有一些可以使用的想法。我没有时间全力以赴,但我想我会与你分享一些可能会让你滚动的想法。(也许以后)
现在只选择“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' 开始)
我想给你半个答案总比什么都没有好。
推荐阅读
- php - 如何检查输入的数据是否在 foreach 中?
- c# - 会话 cookie 似乎不包括在内
- java - 如何给读用户一些写权限
- aws-lambda - 一个 AWS CloudWatch 事件来控制多件事
- javascript - 如何在 react-bootstrap-table2 组件中以编程方式验证行?
- maven - 创建一个新的 Maven 项目
- awesome-wm - 在 awesome-wm 中自动生成小部件
- scala - 数据源 io.pivotal.greenplum.spark.GreenplumRelationProvider 不支持流式写入
- javascript - 寻找一种简写的 JS 方法来评估多个对象/对象状态的存在并设置为 bool
- python - pandas:在转换数据框的集合列时,缓冲区的维数错误(预期为 1,得到 0)