如何在 Pandas 数据框中扩展 date_range?
How to extend date_range in Pandas Dataframe?
有些数据每 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)
那 returns:
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
如何做到这一点?
我认为你需要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
...
...
有些数据每 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)
那 returns:
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
如何做到这一点?
我认为你需要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
...
...