python - 如何填补日期列中的空白?
问题描述
我有一个数据框 df,其中包含每个产品“id”和产品“质量”的每日销售数字,例如:
date | id | qual | col1 | col2 | col3
2020-10-01 | a | B | 1 | 2 | 3
2020-10-02 | a | B | 1 | 2 | 3
2020-10-05 | a | B | 13 | 8 | 7
2020-10-02 | a | C | 3 | 6 | 9
2020-10-05 | a | C | 26 | 16 | 14
2020-10-02 | b | B | 100 | 200 | 300
2020-10-04 | b | B | 49 | 19 | 9
产品 = 列“id”
对于销售额为 0 的日子,我没有条目,因此它们丢失了。但我想为每个产品“id”添加那些缺失的日子。
每个产品的结束日期应该是我可以通过变量设置的日期,比如
end_date = "2020-10-10"
或整个数据框中的最新日期(对于任何产品“id”),例如
end_date = "2020-10-05"
结果应如下所示(对于变量 end_date = "2020-10-10"):
date | id | qual | col1 | col2 | col3
2020-10-01 | a | B | 1 | 2 | 3
2020-10-02 | a | B | 1 | 2 | 3
2020-10-03 | a | B | 0 | 0 | 0
2020-10-04 | a | B | 0 | 0 | 0
2020-10-05 | a | B | 13 | 8 | 7
2020-10-06 | a | B | 0 | 0 | 0
2020-10-07 | a | B | 0 | 0 | 0
2020-10-08 | a | B | 0 | 0 | 0
2020-10-09 | a | B | 0 | 0 | 0
2020-10-10 | a | B | 0 | 0 | 0
2020-10-01 | a | C | 0 | 0 | 0
2020-10-02 | a | C | 3 | 6 | 9
2020-10-03 | a | C | 0 | 0 | 0
2020-10-04 | a | C | 0 | 0 | 0
2020-10-05 | a | C | 26 | 16 | 14
2020-10-06 | a | C | 0 | 0 | 0
2020-10-07 | a | C | 0 | 0 | 0
2020-10-08 | a | C | 0 | 0 | 0
2020-10-09 | a | C | 0 | 0 | 0
2020-10-10 | a | C | 0 | 0 | 0
2020-10-01 | b | B | 0 | 0 | 0
2020-10-02 | b | B | 100 | 200 | 300
2020-10-03 | b | B | 0 | 0 | 0
2020-10-04 | b | B | 49 | 19 | 9
2020-10-05 | b | B | 0 | 0 | 0
2020-10-06 | b | B | 0 | 0 | 0
2020-10-07 | b | B | 0 | 0 | 0
2020-10-08 | b | B | 0 | 0 | 0
2020-10-09 | b | B | 0 | 0 | 0
2020-10-10 | b | B | 0 | 0 | 0
或者像这样(对于日期列中的最新日期=“2020-10-05”)
date | id | qual | col1 | col2 | col3
2020-10-01 | a | B | 1 | 2 | 3
2020-10-02 | a | B | 1 | 2 | 3
2020-10-03 | a | B | 0 | 0 | 0
2020-10-04 | a | B | 0 | 0 | 0
2020-10-05 | a | B | 13 | 8 | 7
2020-10-01 | a | C | 0 | 0 | 0
2020-10-02 | a | C | 3 | 6 | 9
2020-10-03 | a | C | 0 | 0 | 0
2020-10-04 | a | C | 0 | 0 | 0
2020-10-05 | a | C | 26 | 16 | 14
2020-10-01 | b | B | 0 | 0 | 0
2020-10-02 | b | B | 100 | 200 | 300
2020-10-03 | b | B | 0 | 0 | 0
2020-10-04 | b | B | 49 | 19 | 9
2020-10-05 | b | B | 0 | 0 | 0
如何为熊猫中的每个变体执行此操作?
解决方案
在每个组中使用DataFrame.reindex
with in lambda 函数,例如:date_range
df['date']= pd.to_datetime(df['date'])
end_date = "2020-10-10"
df = (df.set_index('date')
.groupby(['id','qual'])
.apply(lambda x: x.reindex(pd.date_range(x.index.min(), end_date), fill_value=0))
.drop(['id','qual'], axis=1)
.rename_axis(['id','qual','date'])
.reset_index())
如果出现需要预处理数据的错误,请在groupby + apply
解决方案之前添加代码:
“ValueError:无法从重复轴重新索引”
id
这意味着每个with date
s都有重复项。
可能的解决方案是首先删除重复项:
df = df.drop_duplicates(['date','qual','id'])
或聚合,例如按总和:
df = df.groupby(['date','qual','id']).sum()
推荐阅读
- android - Android - 如何从软输入键盘中删除建议行
- html - 使悬停功能与移动设备兼容
- python - 导入 Fernet 对象和导入完整模块有什么区别?
- relational-algebra - 使用关系代数找到元素的正确子集
- java - Java 类型转换和变量类型赋值
- reactjs - ReactJs/Gatsby 与 Clarifai 处理 Netlify 错误
- java - 模拟 org.springframework.web.reactive.function.client.WebClient.ResponseSpec#onStatus 输入参数
- jquery - 日期选择器返回未定义日期选择器错误
- sql - 使用系统版本表选择值的开始和结束日期时间的 SQL 查询
- c - C 中的链表:访问 current->next 既不是 NULL 也不是 !NULL;添加新节点的问题