python - 使用不存在的日期扩展数据框
问题描述
我有一个包含不规则时间事件的数据框。我想通过每周添加额外的行(起初为空,稍后填充)来扩展它,但还没有。这是我到目前为止所拥有的:
import pandas as pd
df = pd.DataFrame({'id' : [1,1,2,2,2],
'date': ['2019-01-01', '2019-02-01', '2019-01-01', '2019-03-01', '2019-05-01'],
'value': [100, 200, 300, 400, 500]})
df["week"] = pd.to_datetime(df["date"]).dt.to_period('W')
all_weeks = pd.period_range(min(df["date"]), max(df["date"]), freq='W')
all_weeks
PeriodIndex(['2018-12-31/2019-01-06', '2019-01-07/2019-01-13',
'2019-01-14/2019-01-20', '2019-01-21/2019-01-27',
'2019-01-28/2019-02-03', '2019-02-04/2019-02-10',
'2019-02-11/2019-02-17', '2019-02-18/2019-02-24',
'2019-02-25/2019-03-03', '2019-03-04/2019-03-10',
'2019-03-11/2019-03-17', '2019-03-18/2019-03-24',
'2019-03-25/2019-03-31', '2019-04-01/2019-04-07',
'2019-04-08/2019-04-14', '2019-04-15/2019-04-21',
'2019-04-22/2019-04-28', '2019-04-29/2019-05-05'],
dtype='period[W-SUN]', freq='W-SUN')
我的数据涵盖 18 周,因此我想df
扩展它以使其具有 18*2 = 36 行,values
新添加的行为空,但两个id
s 出现 18 次。我怎样才能做到这一点?
预期输出:
id week value
1.0 '2018-12-31/2019-01-06' 100
1.0 '2019-01-07/2019-01-13' NaN
...
1.0 '2019-04-29/2019-05-05' NaN
2.0 '2018-12-31/2019-01-06' 300
2.0 '2019-01-07/2019-01-13' NaN
...
我认为这是沿列的外部合并week
,但我还没有弄清楚他的。
解决方案
编辑 2019-10-20
每组应用的自定义功能id
:
def period_index(df, num_weeks=36):
weeks = pd.period_range(min(df["date"]),
periods=num_weeks,
freq='W',
name='week')
return df.reindex(weeks).drop('id', axis=1)
设置索引df
:
df.set_index('week', inplace=True)
Groupbyid
并应用我们的函数,清理列和索引:
df.groupby('id').apply(period_index).reset_index().drop('date', axis=1)
输出样本:
id week value
0 1 2018-12-31/2019-01-06 100.0
1 1 2019-01-07/2019-01-13 NaN
2 1 2019-01-14/2019-01-20 NaN
3 1 2019-01-21/2019-01-27 NaN
4 1 2019-01-28/2019-02-03 200.0
5 1 2019-02-04/2019-02-10 NaN
6 1 2019-02-11/2019-02-17 NaN
7 1 2019-02-18/2019-02-24 NaN
8 1 2019-02-25/2019-03-03 NaN
9 1 2019-03-04/2019-03-10 NaN
....
62 2 2019-07-01/2019-07-07 NaN
63 2 2019-07-08/2019-07-14 NaN
64 2 2019-07-15/2019-07-21 NaN
65 2 2019-07-22/2019-07-28 NaN
66 2 2019-07-29/2019-08-04 NaN
67 2 2019-08-05/2019-08-11 NaN
68 2 2019-08-12/2019-08-18 NaN
69 2 2019-08-19/2019-08-25 NaN
70 2 2019-08-26/2019-09-01 NaN
71 2 2019-09-02/2019-09-08 NaN
推荐阅读
- sql - Oracle 表大小
- python - 尝试运行 pygame 时出错:“视频系统未初始化”
- python - 修改一列的值,在原值后面加一个词
- java - 如何在xml属性中调用java方法
- python - 如何使用带有日期的 plotly graph_objects scatter
- css - 试图“转换:旋转()”
使用样式组件的元素 - spring-security - 如何使用 Vue.js 正确配置 Spring Security 5 OAuth?
- node.js - 如何在 mocha chai 中发送表单数据格式的正文
- python-3.x - 使用 boto3 检查 s3 的存储桶中是否存在目录或子目录
- javascript - 在 Firefox 的 WebExtensions 中通知/提醒用户的方法