如何解决以 numpy.array()、pandas.DataFrame() 或 xarray.DataSet() 的形式展开时间序列,以将缺失的记录包含为 NaN
import numpy as np
import pandas as pd
import xarray as xr
validIdx = np.ones(365*5,dtype= bool)
validIdx[np.random.randint(low=0,high=365*5,size=30)] = False
time = pd.date_range("2000-01-01",freq="H",periods=365 * 5)[validIdx]
data = np.arange(365 * 5)[validIdx]
ds = xr.Dataset({"foo": ("time",data),"time": time})
df = ds.to_dataframe()
在上面的示例中,时间序列数据 ds
(或 df
)有 30 条随机选择的缺失记录没有将这些记录作为 NaN。因此,数据的长度是 365x5 - 30,而不是 365x5)。
我的问题是:如何扩展 ds
和 df
以将 30 个缺失值作为 NaN(因此,长度为 365x5)?例如,如果示例数据中遗漏了“2000-12-02”中的一个值,则它看起来像:
...
2000-12-01 value 1
2000-12-03 value 2
...
,而我想要的是:
...
2000-12-01 value 1
2000-12-02 NaN
2000-12-03 value 2
...
解决方法
也许您可以在 1 小时内尝试 resample
。
没有 NaN 的 df
(就在 df = ds.to_dataframe()
之后):
>>> df
foo
time
2000-01-01 00:00:00 0
2000-01-01 01:00:00 1
2000-01-01 02:00:00 2
2000-01-01 03:00:00 3
2000-01-01 04:00:00 4
... ...
2000-03-16 20:00:00 1820
2000-03-16 21:00:00 1821
2000-03-16 22:00:00 1822
2000-03-16 23:00:00 1823
2000-03-17 00:00:00 1824
[1795 rows x 1 columns]
带有 NaN (df
) 的 df_1h
:
>>> df_1h = df.resample('1H').mean()
>>> df_1h
foo
time
2000-01-01 00:00:00 0.0
2000-01-01 01:00:00 1.0
2000-01-01 02:00:00 2.0
2000-01-01 03:00:00 3.0
2000-01-01 04:00:00 4.0
... ...
2000-03-16 20:00:00 1820.0
2000-03-16 21:00:00 1821.0
2000-03-16 22:00:00 1822.0
2000-03-16 23:00:00 1823.0
2000-03-17 00:00:00 1824.0
[1825 rows x 1 columns]
包含 NaN 的行:
>>> df_1h[df_1h['foo'].isna()]
foo
time
2000-01-02 10:00:00 NaN
2000-01-04 07:00:00 NaN
2000-01-05 06:00:00 NaN
2000-01-09 02:00:00 NaN
2000-01-13 15:00:00 NaN
2000-01-16 16:00:00 NaN
2000-01-18 21:00:00 NaN
2000-01-21 22:00:00 NaN
2000-01-23 19:00:00 NaN
2000-01-24 01:00:00 NaN
2000-01-24 19:00:00 NaN
2000-01-27 12:00:00 NaN
2000-01-27 16:00:00 NaN
2000-01-29 06:00:00 NaN
2000-02-02 01:00:00 NaN
2000-02-06 13:00:00 NaN
2000-02-09 11:00:00 NaN
2000-02-15 12:00:00 NaN
2000-02-15 15:00:00 NaN
2000-02-21 04:00:00 NaN
2000-02-28 05:00:00 NaN
2000-02-28 06:00:00 NaN
2000-03-01 15:00:00 NaN
2000-03-02 18:00:00 NaN
2000-03-04 18:00:00 NaN
2000-03-05 20:00:00 NaN
2000-03-12 08:00:00 NaN
2000-03-13 20:00:00 NaN
2000-03-16 01:00:00 NaN
df_1h
中 NaN 的数量:
>>> df_1h.isnull().sum()
foo 30
dtype: int64
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。