【问题标题】:Fill NaN value to continuous time series data where some timeframe were missing将 NaN 值填充到缺少某些时间范围的连续时间序列数据
【发布时间】:2017-05-02 22:26:22
【问题描述】:

我的问题的说明

处理每小时变化的时间序列数据,其中包含从 2016-01-01 00:00 到 2016-01-07 23:00 的日期时间以及与每个时间范围相对应的一些特征。

理想情况下,将有 7 x 24 行数据覆盖所有时间段。但有时,每小时数据可能会因某种原因中断(例如捕获每小时的天气信息,但网站在特定时间中断。)

我的数据框现在包含所有相同的数据而不会丢失小时。我的数据框的长度是 7 * 24 - 5,这意味着有 5 个小时数据丢失。

日期时间以201601010100的格式保存,代表2016-01-01 01:00:00

我的尝试。

我尝试生成长度为 7*24 的新数据帧,其中包含连续的每小时日期时间

data = {"datetime":[],"feature1":[],"feature2":[]}
ff = pd.DataFrame(data)
rng = pd.date_range('01/01/2016', periods=600, freq='H')
new_date = list(rng.strftime('%Y%m%d%H'))
ff['datetime'] = new_date

原始数据框为df,其中包含datetimefeature1feature2

我尝试了 f3 = ff.merge(df, on ='dataframe'')。

但是 f3 仍然是 7*24 的长度。

我的目标

由于实际的时间覆盖和特征维度大,我不想循环两个数据帧并一一比较它们的 datetime.values。

我想根据df中相同的日期时间替换ff中feature的值,并保持NaN信息不变。

【问题讨论】:

    标签: python python-2.7 datetime pandas missing-data


    【解决方案1】:

    在处理日期/时间索引数据时,丢失数据非常常见。没有完美的解决方案 - 完美的解决方案是首先按照您想要的节奏拥有所有数据 - 但是有一些方法可以管理丢失的数据。

    让我们从一些示例数据开始:

    import pandas as pd
    import numpy as np
    
    data = {"datetime": [201601010100,201601010200,201601010400,201601010500],
            "feature1": np.random.randint(1,100,4),
            "feature2": np.random.rand(4) }
    ff = pd.DataFrame(data)
    

    让我们给它一个真正的DatetimeIndex

    ff.index = pd.to_datetime(ff.datetime.astype(str))
    ff.index.name = None
    

    最后用一个包含所有时间的类似索引重新索引

    di = pd.DatetimeIndex(start=ff.index[0], 
                          end=ff.index[-1], 
                          freq='H')
    ff = ff.reindex(di, fill_value='--missing--')
    

    瞧!您的数据会清楚地标明缺失的数据点。作为最后的优雅说明,您可能决定删除原始的低级时间戳:

    del ff['datetime']
    

    产量:

    仍有一些复杂性需要担心。 Pandas 并不完美,它很难处理可以包含多种类型的列。它从根本上与作为其底层存储引擎的 Numpy 阵列相关联,这需要同构阵列。因此,当您像这样重新索引时,您会将NaN 或其他指定的缺失值引入其他列。我为缺失的列选择了一个字符串值,看起来不错,但会将所有列重新转换为 object 类型,如果您的数据框很大,这会影响性能。默认替代方法是在缺失值中插入NaN,会将所有数值列重新转换为浮点数。一种或另一种可能更适合您。浮点数效果很好,例如,如果您的所有特征列都已经是浮点值。但两者都不是完美的。

    【讨论】:

      【解决方案2】:

      创建一个以 rng 为索引的空数据框:

      skeleton = pd.DataFrame(index=rng)
      

      将原始日期转换为 numpy.datetime64 以使其与时间范围兼容:

      df['datetime_ns'] = df['datetime'].astype(numpy.datetime64)
      

      在 index 和 datetime_ns 上执行帧的外连接:

      new_df = df.merge(skeleton, left_on='datetime_ns',right_index=True,how='outer')
      

      如有必要,对新数据框进行排序:

      new_df.sort_values('datetime_ns', inplace=True)
      

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 1970-01-01
        • 2015-12-03
        • 2012-08-02
        • 1970-01-01
        • 2021-06-12
        • 2015-12-18
        • 2017-05-12
        • 1970-01-01
        相关资源
        最近更新 更多