5

有些数据每 5 秒收集一次,有时会丢失。

将它们加载到 Pandas 数据框中后,我想定义一个时间点并准确提取 180 行(15 分钟 x 每分钟 12 个样本),无论起点如何。这些数据提供了一个绘图,并且始终保持相同的大小可以大大简化其余代码。

缺失的数据应该用 None 填充

我认为有一些我不知道的捷径可以做到这一点:

import pandas as pd
import datetime

dt = [
    "2018-02-08 13:45:05",
    "2018-02-08 13:45:10",
    "2018-02-08 13:45:25",
    "2018-02-08 13:45:30",
    "2018-02-08 13:45:35",
    "2018-02-08 13:45:40",
    "2018-02-08 13:45:50",
    "2018-02-08 13:45:55",
    "2018-02-08 13:46:00",
    "2018-02-08 13:46:05",
]

wl = [
    4737.25,
    4834.80,
    4885.53,
    5003.98,
    5031.08,
    5215.90,
    5147.65,
    5100.50,
    5038.94,
    5020.67,
]

df = pd.DataFrame({"dt":dt, "wl":wl}).set_index("dt")
df.index = pd.to_datetime(df.index)
df = df.resample("5s").mean()
print(df)

返回:

                          wl
dt                          
2018-02-08 13:45:05  4737.25
2018-02-08 13:45:10  4834.80
2018-02-08 13:45:15      NaN
2018-02-08 13:45:20      NaN
2018-02-08 13:45:25  4885.53
2018-02-08 13:45:30  5003.98
2018-02-08 13:45:35  5031.08
2018-02-08 13:45:40  5215.90
2018-02-08 13:45:45      NaN
2018-02-08 13:45:50  5147.65
2018-02-08 13:45:55  5100.50
2018-02-08 13:46:00  5038.94
2018-02-08 13:46:05  5020.67

这没关系,但日期时间范围由第一个和最后一个样本的日期时间定义。

我感兴趣的日期时间范围是:

new_datetime_range = pd.date_range(start=df.index.min(), freq="5s", periods=180)
print(new_datetime_range)

高达'2018-02-08 14:00:00'.

我试图获得

                          wl
dt                          
2018-02-08 13:45:05  4737.25
2018-02-08 13:45:10  4834.80
2018-02-08 13:45:15      NaN
2018-02-08 13:45:20      NaN
2018-02-08 13:45:25  4885.53
2018-02-08 13:45:30  5003.98
2018-02-08 13:45:35  5031.08
2018-02-08 13:45:40  5215.90
2018-02-08 13:45:45      NaN
2018-02-08 13:45:50  5147.65
2018-02-08 13:45:55  5100.50
2018-02-08 13:46:00  5038.94
2018-02-08 13:46:05  5020.67
2018-02-08 13:46:10      Nan
2018-02-08 13:46:15      Nan
............................
2018-02-08 13:59:45      Nan
2018-02-08 13:59:50      Nan
2018-02-08 13:59:55      Nan
2018-02-08 14:00:00      Nan

怎么可能做到这一点?

4

1 回答 1

3

我认为你需要reindex

df = df.resample("5s").mean().reindex(new_datetime_range)

另一种解决方案是手动添加最后日期index

last = pd.date_range(start=df.index.min(), freq="5s", periods=180)[-1]
df.loc[last] = np.nan
df = df.resample("5s").mean()

print(df)
                          wl
2018-02-08 13:45:05  4737.25
2018-02-08 13:45:10  4834.80
2018-02-08 13:45:15      NaN
2018-02-08 13:45:20      NaN
2018-02-08 13:45:25  4885.53
2018-02-08 13:45:30  5003.98
2018-02-08 13:45:35  5031.08
2018-02-08 13:45:40  5215.90
2018-02-08 13:45:45      NaN
2018-02-08 13:45:50  5147.65
2018-02-08 13:45:55  5100.50
2018-02-08 13:46:00  5038.94
2018-02-08 13:46:05  5020.67
2018-02-08 13:46:10      NaN
2018-02-08 13:46:15      NaN
...
...
于 2018-02-08T14:41:03.610 回答