python - 根据 pandas 中前一小时的数据添加缺失日期的数据
问题描述
我有一个如下的数据框:-
ID | creTimestamp | CPU负载 | 实例 ID |
---|---|---|---|
0 | 2021-01-22 18:00:00 | 22.0 | 实例A |
1 | 2021-01-22 19:00:00 | 22.5 | 实例A |
2 | 2021-01-22 20:00:00 | 23.5 | 实例A |
3 | 2021-01-22 18:00:00 | 24.0 | 实例B |
4 | 2021-01-22 19:00:00 | 24.5 | 实例B |
5 | 2021-01-22 20:00:00 | 22.5 | 实例B |
6 | 2021-01-24 18:00:00 | 23.0 | 实例A |
7 | 2021-01-24 19:00:00 | 23.5 | 实例A |
8 | 2021-01-24 20:00:00 | 24.0 | 实例A |
9 | 2021-01-24 18:00:00 | 25.5 | 实例B |
10 | 2021-01-24 19:00:00 | 28.5 | 实例B |
11 | 2021-01-24 20:00:00 | 23.5 | 实例B |
缺日日期如下:
2021-01-23 2021-01-25
我还想用以前的日期填充 2021-01-23 和 2021-01-25 的行。例如,应考虑 22 日期 HR 数据。我有一个巨大的数据集,其中日期的整个数据可能会丢失 2 小时。日期也可以从未来的日期范围生成。2021-02-01 18:00:00 到 2021-02-02 18:00:00 的示例
更新的数据框应如下所示:-
ID | creTimestamp | CPU负载 | 实例 ID |
---|---|---|---|
0 | 2021-01-22 18:00:00 | 22.0 | 实例A |
1 | 2021-01-22 19:00:00 | 22.5 | 实例A |
2 | 2021-01-22 20:00:00 | 23.5 | 实例A |
3 | 2021-01-22 18:00:00 | 24.0 | 实例B |
4 | 2021-01-22 19:00:00 | 24.5 | 实例B |
5 | 2021-01-22 20:00:00 | 22.5 | 实例B |
6 | 2021-01-23 18:00:00 | 22.0 | 实例A |
7 | 2021-01-23 19:00:00 | 22.5 | 实例A |
8 | 2021-01-23 20:00:00 | 23.5 | 实例A |
9 | 2021-01-23 18:00:00 | 24.0 | 实例B |
10 | 2021-01-23 19:00:00 | 24.5 | 实例B |
11 | 2021-01-23 20:00:00 | 22.5 | 实例B |
12 | 2021-01-24 18:00:00 | 23.0 | 实例A |
13 | 2021-01-24 19:00:00 | 23.5 | 实例A |
14 | 2021-01-24 20:00:00 | 24.0 | 实例A |
15 | 2021-01-24 18:00:00 | 25.5 | 实例B |
16 | 2021-01-24 19:00:00 | 28.5 | 实例B |
17 | 2021-01-24 20:00:00 | 23.5 | 实例B |
18 | 2021-01-25 18:00:00 | 23.0 | 实例A |
19 | 2021-01-25 19:00:00 | 23.5 | 实例A |
20 | 2021-01-25 20:00:00 | 24.0 | 实例A |
21 | 2021-01-25 18:00:00 | 25.5 | 实例B |
22 | 2021-01-25 19:00:00 | 28.5 | 实例B |
23 | 2021-01-25 20:00:00 | 23.5 | 实例B |
日期范围可以是过去 7 天。
请帮我解决这个要求。
谢谢
解决方案
这是填充值的延续
- 生成一个由采样小时数和实例组合而成的 DF (
df2
) - 这将生成 15 行,因为在 3 个日期 (2+3)*3 中,instanceA 有 3 次,instanceB 有 2 次
- 然后使用相同的技术来填充CPULoad和综合memload
- 针对 pandas 1.0.1 和 1.2.0 进行测试
import pandas as pd
import io
import datetime as dt
import numpy as np
df = pd.read_csv(io.StringIO("""id creTimestamp CPULoad instnceId
0 2021-01-22 18:00:00 22.0 instanceA
1 2021-01-22 19:00:00 22.0 instanceA
2 2021-01-22 20:00:00 23.0 instanceB
3 2021-01-23 18:00:00 24.0 instanceA
4 2021-01-23 20:00:00 22.0 instanceA
5 2021-01-24 18:00:00 23.0 instanceB
6 2021-01-24 20:00:00 23.5 instanceA
"""), sep="\t", index_col=0)
df.creTimestamp = pd.to_datetime(df.creTimestamp)
df["memload"] = np.random.random(len(df))
# generate a DF for each time in instance in each date
df2 = (pd.merge(
# for each time in instance
df.assign(timestamp=df.creTimestamp.dt.time)
.loc[:,["instnceId","timestamp"]]
.drop_duplicates()
.assign(foo=1),
# for each date
df.creTimestamp.dt.date.drop_duplicates().to_frame().assign(foo=1),
on="foo"
).assign(creTimestamp=lambda dfa: dfa.apply(lambda r: dt.datetime.combine(r["creTimestamp"], r["timestamp"]), axis=1))
.drop(columns="foo")
# merge values back..
.merge(df, on=["creTimestamp", "instnceId"], how="left")
)
# now get values to fill NaN
df2 = (df2.merge(df2.dropna().drop_duplicates(subset=["instnceId","timestamp"], keep="last"),
on=["timestamp","instnceId"], suffixes=("","_pre"))
.assign(CPULoad=lambda dfa: dfa.CPULoad.fillna(dfa.CPULoad_pre))
.assign(memload=lambda dfa: dfa.memload.fillna(dfa.memload_pre))
)
输出
instnceId timestamp creTimestamp CPULoad creTimestamp_pre CPULoad_pre
0 instanceA 18:00:00 2021-01-22 18:00:00 22.0 2021-01-23 18:00:00 24.0
1 instanceA 18:00:00 2021-01-23 18:00:00 24.0 2021-01-23 18:00:00 24.0
2 instanceA 18:00:00 2021-01-24 18:00:00 24.0 2021-01-23 18:00:00 24.0
3 instanceA 19:00:00 2021-01-22 19:00:00 22.0 2021-01-22 19:00:00 22.0
4 instanceA 19:00:00 2021-01-23 19:00:00 22.0 2021-01-22 19:00:00 22.0
5 instanceA 19:00:00 2021-01-24 19:00:00 22.0 2021-01-22 19:00:00 22.0
6 instanceB 20:00:00 2021-01-22 20:00:00 23.0 2021-01-22 20:00:00 23.0
7 instanceB 20:00:00 2021-01-23 20:00:00 23.0 2021-01-22 20:00:00 23.0
8 instanceB 20:00:00 2021-01-24 20:00:00 23.0 2021-01-22 20:00:00 23.0
9 instanceA 20:00:00 2021-01-22 20:00:00 23.5 2021-01-24 20:00:00 23.5
10 instanceA 20:00:00 2021-01-23 20:00:00 22.0 2021-01-24 20:00:00 23.5
11 instanceA 20:00:00 2021-01-24 20:00:00 23.5 2021-01-24 20:00:00 23.5
12 instanceB 18:00:00 2021-01-22 18:00:00 23.0 2021-01-24 18:00:00 23.0
13 instanceB 18:00:00 2021-01-23 18:00:00 23.0 2021-01-24 18:00:00 23.0
14 instanceB 18:00:00 2021-01-24 18:00:00 23.0 2021-01-24 18:00:00 23.0
推荐阅读
- javascript - 从 React.js 到节点后端的休息调用错误
- sql - 试图创建一个返回不正确语法错误的过程
- python - Dask 自适应缩放因错误而失败
- android - 使用 NumberPicker 减小 MaterialAlertDialog 的宽度
- java - 提供了带有 Spring Boot 启动器 Web 的 Spring Boot 应用程序
- vba - 如何比较 MS Access 中的两个文本框?
- javascript - Vue 去抖滑块事件
- ios - 为应用中所有 UIViewController 的标题实现 DidSet
- masstransit - MassTransit JobConsumer 示例因超时异常而失败
- javascript - 通过 JavaScript 正则表达式解析自定义数据