【问题标题】:How to extend date_range in Pandas Dataframe?如何在 Pandas Dataframe 中扩展 date_range?
【发布时间】:2018-07-19 04:10:53
【问题描述】:

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

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

缺失的数据应该用无填充

我假设有一些我不知道的捷径:

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

这怎么可能?

【问题讨论】:

    标签: pandas date-range datetimeindex


    【解决方案1】:

    我觉得你需要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
    ...
    ...
    

    【讨论】:

    • 谢谢@jezrael!它完美地工作。我过去见过 reindex,但从来不明白如何正确使用它。第二种解决方案也很聪明,只是考虑到最后一个值没有被 NaN 替换。
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 2017-11-28
    • 2023-01-10
    • 2012-10-05
    • 2019-11-05
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多