【问题标题】:Cleaning timeseries data and Standardizing the sample rate in Python在 Python 中清理时间序列数据并标准化采样率
【发布时间】:2020-06-25 23:45:48
【问题描述】:

我有一个时间序列数据,我想通过近似缺失数据点和标准化采样率来清理数据。

鉴于可能存在一些不均匀间隔的数据点这一事实,我想定义一个函数来获取时间序列和间隔 X(例如,30 分钟或任何其他间隔)作为输入,并给出点为的时间序列在 X 间隔内间隔作为输出。

如下所示,周期是每 10 分钟一次,但缺少一些数据点。所以算法应该检测丢失的时间并删除它们并创建适当的时间并为它们生成值。然后根据定义的函数,改变和标准化采样率。 为了近似缺失数据并对其进行清理,平均或线性插值都可以。

这是原始数据的一部分:

import pandas as pd

import numpy as np

df = pd.DataFrame({

    "Time": ["10:09:00","10:19:00","10:29:00","10:43:00","10:59:00 ", "11:09:00"],
    "Value": ["378","378","379","377","376", "377"],
    
})

df

【问题讨论】:

  • 您在第一个时间戳中忘记了一个数字,并且您还有一些尾随空格,您需要先删除这些空格。

标签: python pandas time-series


【解决方案1】:

首先您需要将"Time"" 转换为日期时间索引。使用df["Time"] = pd.to_datetime(df["Time"]) 让 pandas 将日期识别为实际日期。然后将时间设置为索引:df = df.set_index("Time")

一旦有了日期时间索引,就可以用它进行各种基于时间的操作。在您的情况下,您想要重新采样df.resample('10T')

这给我们留下了以下代码:

df["Time"] = pd.to_datetime(df["Time"], format="%H:%S:%M")
df = df.set_index("Time")

df.resample('10T')

从这里开始,对于如何处理缺少数据(填充/插值/...)或一个新数据点有多个数据点(平均/总和/ ...)。我建议你看看the pandas resampling api。有关stringdatetime 之间的转换和格式设置,请参阅strftime

【讨论】:

  • 感谢您的评论。实际上我已经将“时间”列转换为日期时间索引。我的主要问题是如何填充/插入 NaN 值,然后如何定义新的重采样率(例如 144 分钟)和每天返回“值”的函数(假设每 10 分钟收集一次数据) ...因此每 144 个点将依次代表一天内收集的数据)。我想定义一个自定义函数来获取输入并返回所需的输出。
  • 这取决于如何你想具体插值和聚合。例如,对于 10 分钟的采样频率,具有多个数据点的平均值和缺失数据点的线性插值,您可以使用 df.resample('10T').mean().interpolate('linear')。对于日常手段,只需使用df.resample('1D').mean()
  • 非常感谢...只是另一个简单的问题...您为什么会认为 df.resample('10T')。 interpolate('linear') 不起作用并给出错误“ValueError: cannot reindex from a duplicate axis”...我的意思是“df.resample('10T').mean().interpolate('linear') " 从数学的角度来看," 与 "df.resample('10T'). interpolate('linear')" 有什么不同?
  • 在使用.interpolate(填充NaN 值)之前,您必须决定如何处理一个时间戳有多个值的情况(类似于.groupby.aggregate())。 .mean() 函数告诉重采样器在这些情况下使用平均值并返回正常的数据帧。
猜你喜欢
  • 2013-10-15
  • 2019-01-19
  • 2013-02-03
  • 1970-01-01
  • 2020-12-28
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多