时间序列排序和不足部分由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替换的主要内容,如果未能解决你的问题,请参考以下文章
Python:替换数组中的 NaN 或 MEAN 而不是 -999 值[重复]