Python 根据pandas中的前一小时数据添加缺失日期的数据
我有一个如下所示的数据帧:- 身份证件 时间戳 普洛德 仪器ID 0 2021-01-22 18:00:00 22 瞬间 1. 2021-01-22 19:00:00 22.5 瞬间 2. 2021-01-22 20:00:00 23.5 瞬间 3. 2021-01-22 18:00:00 24 实例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 瞬间 7. 2021-01-24 19:00:00 23.5 瞬间 8. 2021-01-24 20:00:00 24 瞬间 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 实例bPython 根据pandas中的前一小时数据添加缺失日期的数据,python,pandas,dataframe,datetime,time,Python,Pandas,Dataframe,Datetime,Time,我有一个如下所示的数据帧:- 身份证件 时间戳 普洛德 仪器ID 0 2021-01-22 18:00:00 22 瞬间 1. 2021-01-22 19:00:00 22.5 瞬间 2. 2021-01-22 20:00:00 23.5 瞬间 3. 2021-01-22 18:00:00 24 实例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 瞬间 7. 2
这是本书的延续
- 生成由采样小时数和实例组合而成的DF(
)df2
- 这将生成15行,因为instanceA有3次,instanceB有2次,跨越3个日期(2+3)*3
- 然后使用相同的技术填充CPULoad和合成memload
- 针对熊猫1.0.1和1.2.0进行测试
这是本书的延续
- 生成由采样小时数和实例组合而成的DF(
)df2
- 这将生成15行,因为instanceA有3次,instanceB有2次,跨越3个日期(2+3)*3
- 然后使用相同的技术填充CPULoad和合成memload
- 针对熊猫1.0.1和1.2.0进行测试
对于缺少的行,您希望在CPULoad列和InstanceID列中填充什么?上一个日期和相同的小时数据。如果您看到更新的datframe,CPULoad的数据为2021-01-22 19:00:00,即22。实例也应该是相同的。与我的示例中的实例A类似,对于缺少的行,您希望在CPULoad和InstanceID列中填充什么?上一个日期和相同的小时数据。如果您看到更新的datframe,CPULoad的数据为2021-01-22 19:00:00,即22。实例也应该是相同的。与我的示例中的实例A一样,我遇到了错误,传递列表喜欢。不再支持带有任何缺少标签的loc或[],请参阅“”。熊猫版是1.0.5。第二,我想知道不在这个范围内的日期。示例2021-02-01 18:00:00至2021-02-02 18:00:00。因此,与原始DF的合并将产生NaN。知道如何转发不在dataset time range.version中的时间的填充值吗<代码>pd.\uuuuu版本\uuuuu我使用的是1.2.0版本,而版本是1.0.5。关于合并数据集的min()和max()之外的日期范围有什么线索吗?您对所需行的逻辑很奇怪。。。。instanceA有3次(18:00,19:00,20:00),instanceB有2次(18:00,20:00)和3个日期,因此预期的行应该是(3+2)*5=15。基本逻辑是每个时间戳,每个实例应该有2个条目。一个是实例A,实例B,但这不是我担心的。我可以基于每个实例创建2个diff DF并合并它们,但挑战是填充未来日期的值。我遇到错误,传递列表喜欢。不再支持带有任何缺少标签的loc或[],请参阅“”。熊猫版是1.0.5。第二,我想知道不在这个范围内的日期。示例2021-02-01 18:00:00至2021-02-02 18:00:00。因此,与原始DF的合并将产生NaN。知道如何转发不在dataset time range.version中的时间的填充值吗<代码>pd.\uuuuu版本\uuuuu我使用的是1.2.0版本,而版本是1.0.5。关于合并数据集的min()和max()之外的日期范围有什么线索吗?您对所需行的逻辑很奇怪。。。。instanceA有3次(18:00,19:00,20:00),instanceB有2次(18:00,20:00)和3个日期,因此预期的行应该是(3+2)*5=15。基本逻辑是每个时间戳,每个实例应该有2个条目。一个是实例A,实例B,但这不是我担心的。我可以基于每个实例创建2个diff DF并合并它们,但挑战是填充未来日期的值。
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