如何检查时间序列数据(月度数据)的缺失值?

Posted

技术标签:

【中文标题】如何检查时间序列数据(月度数据)的缺失值?【英文标题】:How to check for missing values for a TimeSeries Data(Monthly Data)? 【发布时间】:2022-01-20 22:44:53 【问题描述】:

例子:

DATE ENERGY_INDEX
0 01/1939 3.3842
1 02/1939 3.4100
2 03/1939 3.4875
3 04/1939 3.5133
4 05/1939 3.5133

如何检查时间序列数据中是否遗漏了任何月份的数据?

我查找缺失值的方法:

df['DATE']=pd.to_datetime(df['DATE'],format='%m/%Y')
df.index=df['DATE']
df['DATE'].max()-df['DATE'].min()` - output - Timedelta('29463 days 00:00:00')
df.shape - output - (969,2)

其实df['DATE']=pd.to_datetime(df['DATE'],format='%m/%Y')就是在日期里面加上日期参数。

【问题讨论】:

嘿@JCaesar,请在编辑后的帖子中找到我尝试过的方法 【参考方案1】:

我建议你使用 Pandas 数据框:

!pip install pandas
import pandas as pd
main_na = pd.Dataframe(your_datas) #Where your_datas is your list or np array
main_na = main_df.notna()
for col in main_na.columns:
    diff = len(main_na[col]) - main_na.count()[col]
    if diff > 0:
        print( f"len(main_na[col]) - main_na.count()[col] NaN found in column col")
main_df.ffill(inplace=True)
main_df.dropna()

我经常使用的这段代码会在你的数据中打印出 NaN 的数量

但是,如果您遇到可能缺少行的情况,您应该使用您的日期列来创建一个新的时间戳列(看看这里:Python pandas convert datetime to timestamp effectively through dt accessor)。然后将此新列设置为数据框的索引,使用:

main_df.set_index("name of your new timestamp colums")

然后这样做:

main_df.sort_index(ascending=True, inplace=True)
time_df = main_df.copy()
time_df["diff"] = time_df.index
time_df["diff"] = time_df["diff"]-time_df["diff"].shift(1)
time_df = time_df["diff"]
print(time_df.value_counts())

例如,它将显示每一行之间的时间戳差异:

900000.0      68383
4500000.0         3
8100000.0         2
9900000.0         2
17100000.0        2
21600000.0        1
13500000.0        1
14400000.0        1
5400000.0         1
6300000.0         1
Name: diff, dtype: int64

左栏为时间差,右栏为病例数。

【讨论】:

以上是关于如何检查时间序列数据(月度数据)的缺失值?的主要内容,如果未能解决你的问题,请参考以下文章

用滚动平均值或其他插值替换 NaN 或缺失值

如何在熊猫中将月度数据转换为季度

在 python 或 spark 中获取大数据缺失值的最快方法是啥?

如何在数据框中指定缺失值

如何不绘制缺失的时期

R语言-均值填充缺失值