时间序列排序和不足部分由python中的NaN替换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间序列排序和不足部分由python中的NaN替换相关的知识,希望对你有一定的参考价值。

我有这样的数据帧

index                 value
2014-05-21 09:00:00   0
2014-05-22 10:00:00   23.66
2014-05-22 11:00:00   7.54
2014-05-22 12:00:00   17.83
...
2017-07-10 23:00:00   9.43

索引是时间(时间步长是'小时'),第一列是值。现在我想创建一个看起来像这样的新数据框

index          value
2014-05-21     [NaN, NaN, NaN ... 23.66, 7.54, 17.83, ...]
2014-05-22     [2.64, 7.43, 9.88, 0, 13.4, ...           ]
2014-05-23     [  ...                                    ] 
...
2017-07-10     [  ...                              , 9.43]  

索引是时间(时间步长是'天'),值是一个numpy安排(或列表),每个包含24个值(24小时数据),和第一天的数据一样,丢失的数据会自动替换为“NaN”

因为最后我想计算下面的年平均值(例如名为df_average)

index value
1     [0.5, 5.67, 12.32, ... , 13.21]
2     [ 0, 13.65,  2.34, ... , 2.45 ]
3     [...                          ]
...
365   [...                          ]

列“值”仍然可以显示平均每小时值(内部24个值)和时间序列(索引)是365或365(一年)。并且在计算平均值时会自动跳过“NaN”。

我尝试了一些方法,但缺失的价值仍然让我困惑,代码看起来很愚蠢和冗长,有没有人有更好或聪明的方法来解决它?提前致谢。

答案

IIUC,你做的事情是这样的:

df:

df = pd.DataFrame(data=np.arange(100,148),index=pd.date_range('2014-05-21 09:00:00',periods=48, freq='H'),columns=['value'])

使用reindex为开始和结束添加小时数

df1 = df.reindex(pd.date_range(df.index.floor('D').min(), 
                 df.index.ceil('D').max(), freq='H'))[:-1]

使用unstack重塑数据框:

df1 = df1.set_index([df1.index.floor('D'), df1.index.hour])['value']
   .unstack().apply(lambda x : str(list(x)), axis=1)

print(df1) 

输出:

2014-05-21                      [nan, nan, nan, nan, nan, nan, nan, nan, nan, 100.0, 101.0, 102.0, 103.0, 104.0, 105.0, 106.0, 107.0, 108.0, 109.0, 110.0, 111.0, 112.0, 113.0, 114.0]
2014-05-22    [115.0, 116.0, 117.0, 118.0, 119.0, 120.0, 121.0, 122.0, 123.0, 124.0, 125.0, 126.0, 127.0, 128.0, 129.0, 130.0, 131.0, 132.0, 133.0, 134.0, 135.0, 136.0, 137.0, 138.0]
2014-05-23                                  [139.0, 140.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 147.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]
dtype: object

Edit to add annual by hour row

df2 = df.groupby([df.index.year,df.index.hour]).mean().unstack().apply(lambda x : str(list(x)), axis=1)

df_out = pd.concat([df1,df2])

输出:

2014-05-21 00:00:00                      [nan, nan, nan, nan, nan, nan, nan, nan, nan, 100.0, 101.0, 102.0, 103.0, 104.0, 105.0, 106.0, 107.0, 108.0, 109.0, 110.0, 111.0, 112.0, 113.0, 114.0]
2014-05-22 00:00:00    [115.0, 116.0, 117.0, 118.0, 119.0, 120.0, 121.0, 122.0, 123.0, 124.0, 125.0, 126.0, 127.0, 128.0, 129.0, 130.0, 131.0, 132.0, 133.0, 134.0, 135.0, 136.0, 137.0, 138.0]
2014-05-23 00:00:00                                  [139.0, 140.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 147.0, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]
2014                                                                   [127, 128, 129, 130, 131, 132, 133, 134, 135, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126]
dtype: object

以上是关于时间序列排序和不足部分由python中的NaN替换的主要内容,如果未能解决你的问题,请参考以下文章

如何将用熊猫提取的一列excel数据中的NaN替换为0

在 Python 中用 nan 替换浮点列中的点

Python:替换数组中的 NaN 或 MEAN 而不是 -999 值[重复]

python 替换Pandas中的缺失值(NaN)(Python)

用组平均值替换 NaN 值

Pandas - 用特定组的平均值替换列中的 NaN