python - 更新数据框 ID wrt 缺少日期列值
问题描述
我正在尝试根据数据框中日期列的缺失天数更新数据框的 ID,
Date ID
0 2018-01-01 45.0-A
1 2018-01-02 45.0-A
5 2018-01-06 45.0-A
6 2018-01-07 45.0-A
12 2018-01-13 45.0-A
13 2018-01-14 45.0-A
period = 2
如果数据帧有超过指定period (period =2 )
的days missing
ID 应该用额外的数字更新,我用时间差解决了这个问题并循环数据帧,它需要更多的时间。有人可以建议我实现这一目标的最有效方法吗?
T_diff = data.Date.diff()
slic = [data.index[0]] + T_diff[T_diff.dt.days>period].index.tolist() + [data.index[-1]]
li = []
for i in range(len(slic)-1):
temp_df = data.loc[slic[i]:slic[i+1]].copy()
temp_df['ID'] = temp_df['ID'] + '_{}'.format(i)
li.append(temp_df)
pd.concat(li,axis=0)
Date ID
0 2018-01-01 45.0-A_0
1 2018-01-02 45.0-A_0
5 2018-01-06 45.0-A_1
6 2018-01-07 45.0-A_1
12 2018-01-13 45.0-A_2
13 2018-01-14 45.0-A_2
解决方案
这可以在一行中完成,使用 diff() 和 cumsum()
df['Date'] = pd.to_datetime(df['Date'])
df['ID'] += '_' + (df['Date'].diff() > pd.Timedelta('2D')).cumsum().astype(str)
#output
# Date ID
#0 2018-01-01 45.0-A_0
#1 2018-01-02 45.0-A_0
#5 2018-01-06 45.0-A_1
#6 2018-01-07 45.0-A_1
#12 2018-01-13 45.0-A_2
#13 2018-01-14 45.0-A_2
推荐阅读
- javascript - 从javascript中的数组值的最后一个删除\ r
- laravel - 使用我的restful api更新,选择,发布时出现NotFoundHttpException
- perl - 将变量从 Perl 返回到 Batch
- c# - System.ServiceModel.CommunicationException:'服务端点未能侦听 URI'xxx',因为访问被拒绝
- macos - 如何获取文本字形的真实位置
- unity3d - Unity 单元测试失败,但 GitLab CI 管道作业通过(shell 执行器)
- php - Laravel 应用程序在升级到 php 8 后停止工作
- r - map over list, get item name and content
- iso8583 - Regarding ISO 8583 request response communication in javascript
- php - Passing variables from jQuery/AJAX to Wordpress php function does not work