如何在每天之前插入一行,其值基于前一天的最后一行



我在Pandas中遇到了一件事。我不知道如何在每天开始时添加新行,而不使用for .. in,这需要很多时间。

下面是一个表,其中date_time是用to_datetime创建的timestamp。对于每一天,在09:00:00+01:00之前,我需要添加一行08:00:00+01:00,并复制前一天的最后一个值。

如果有任何帮助,我将不胜感激。

date_time  value
20437 2022-02-10 09:00:00+01:00  80.80 #<-before this
20438 2022-02-10 10:00:00+01:00  80.20
20439 2022-02-10 11:00:00+01:00  80.20
20440 2022-02-10 12:00:00+01:00  80.70
20441 2022-02-10 13:00:00+01:00  81.10
20442 2022-02-10 14:00:00+01:00  81.00
20443 2022-02-10 15:00:00+01:00  80.15
20444 2022-02-10 16:00:00+01:00  80.25
20445 2022-02-10 17:00:00+01:00  79.50
20446 2022-02-11 09:00:00+01:00  79.50 #<-before this
20447 2022-02-11 10:00:00+01:00  79.00
20448 2022-02-11 11:00:00+01:00  78.70
20449 2022-02-11 12:00:00+01:00  78.90
20450 2022-02-11 13:00:00+01:00  79.00
20451 2022-02-11 14:00:00+01:00  79.05
20452 2022-02-11 15:00:00+01:00  79.40
20453 2022-02-11 16:00:00+01:00  79.85
20454 2022-02-11 17:00:00+01:00  79.50

具有以下数据帧:

import pandas as pd
df = pd.DataFrame(
{
"date_time": [
"2022-02-10 09:00:00+01:00",
"2022-02-10 10:00:00+01:00",
"2022-02-10 11:00:00+01:00",
"2022-02-10 12:00:00+01:00",
"2022-02-10 13:00:00+01:00",
"2022-02-10 14:00:00+01:00",
"2022-02-10 15:00:00+01:00",
"2022-02-10 16:00:00+01:00",
"2022-02-10 17:00:00+01:00",
"2022-02-11 09:00:00+01:00",
"2022-02-11 10:00:00+01:00",
"2022-02-11 11:00:00+01:00",
"2022-02-11 12:00:00+01:00",
"2022-02-11 13:00:00+01:00",
"2022-02-11 14:00:00+01:00",
"2022-02-11 15:00:00+01:00",
"2022-02-11 16:00:00+01:00",
"2022-02-11 17:00:00+01:00",
],
"value": [
80.8,
80.2,
80.2,
80.7,
81.1,
81.0,
80.15,
80.25,
79.5,
79.5,
79.0,
78.7,
78.9,
79.0,
79.05,
79.4,
79.85,
79.5,
],
}
)

你可以试试这个:

df["date_time"] = pd.to_datetime(df["date_time"])
new_rows = df.copy()[df["date_time"].dt.hour == 9]
new_rows["date_time"] = new_rows["date_time"].apply(lambda x: x - pd.Timedelta(hours=1))
new_df = pd.concat([df, new_rows]).sort_values(by="date_time", ignore_index=True)
print(new_df)
# Output
date_time  value
0  2022-02-10 08:00:00+01:00  80.80
1  2022-02-10 09:00:00+01:00  80.80
2  2022-02-10 10:00:00+01:00  80.20
3  2022-02-10 11:00:00+01:00  80.20
4  2022-02-10 12:00:00+01:00  80.70
5  2022-02-10 13:00:00+01:00  81.10
6  2022-02-10 14:00:00+01:00  81.00
7  2022-02-10 15:00:00+01:00  80.15
8  2022-02-10 16:00:00+01:00  80.25
9  2022-02-10 17:00:00+01:00  79.50
10 2022-02-11 08:00:00+01:00  79.50
11 2022-02-11 09:00:00+01:00  79.50
12 2022-02-11 10:00:00+01:00  79.00
13 2022-02-11 11:00:00+01:00  78.70
14 2022-02-11 12:00:00+01:00  78.90
15 2022-02-11 13:00:00+01:00  79.00
16 2022-02-11 14:00:00+01:00  79.05
17 2022-02-11 15:00:00+01:00  79.40
18 2022-02-11 16:00:00+01:00  79.85
19 2022-02-11 17:00:00+01:00  79.50

最新更新