Python中的缺失数据点

3

我对Python和编程完全不熟悉。我的数据是按每分钟为间隔采集的,但有些时间可能会丢失。我想填补这些缺失的时间并将相应的数据点设为NaN值。目前我的代码会将所有数据点都设为NaN,而不仅仅是缺失的数据点。

import pandas as pd
df = pd.read_csv("data3.csv", index_col="DateTime")
df = df.reindex(pd.date_range("11-1-2014 12:00:00", "11-1-2014 12:10:00", freq="1min"), fill_value="NaN")
df.to_csv("test3.csv")

我正在阅读的文件

                NSERC_CB04_A0401
DateTime                        
11/1/2014 0:00          1.121889
11/1/2014 0:01          1.121889
11/1/2014 0:02          1.121889
11/1/2014 0:03          1.121889
11/1/2014 0:04          1.118503
11/1/2014 0:05          1.121889
11/1/2014 0:06          1.121889
11/1/2014 0:07          1.121889
11/1/2014 0:09          1.121889
11/1/2014 0:10          1.121889

我正在编写的文件

                               NSERC_CB04_A0401
2014-11-01 12:00:00              NaN
2014-11-01 12:01:00              NaN
2014-11-01 12:02:00              NaN
2014-11-01 12:03:00              NaN
2014-11-01 12:04:00              NaN
2014-11-01 12:05:00              NaN
2014-11-01 12:06:00              NaN
2014-11-01 12:07:00              NaN
2014-11-01 12:08:00              NaN
2014-11-01 12:09:00              NaN
2014-11-01 12:10:00              NaN

我希望你能做什么:

                    NSERC_CB04_A0401
    DateTime                        
    11/1/2014 0:00          1.121889
    11/1/2014 0:01          1.121889
    11/1/2014 0:02          1.121889
    11/1/2014 0:03          1.121889
    11/1/2014 0:04          1.118503
    11/1/2014 0:05          1.121889
    11/1/2014 0:06          1.121889
    11/1/2014 0:07          1.121889
2014-11-01 12:08:00              NaN
    11/1/2014 0:09          1.121889
    11/1/2014 0:10          1.121889
1个回答

4
没有问题,即使你是编程和Python的新手!
你需要在read_csv中添加参数parse_dates=True,将index转换为DatetimIndex,然后再进行reindex - 将开始时间从11-1-2014 12:00:00更改为11-1-2014 00:00:00以匹配结束时间。
此外,字符串NaN不是缺失值,你需要使用np.nan,它是reindex中缺失数据的默认值。
df = pd.read_csv("data3.csv", index_col="DateTime", parse_dates=True)

df = df.reindex(pd.date_range("11-1-2014 00:00:00", "11-1-2014 00:10:00", freq="1min"))
print (df)
                     NSERC_CB04_A0401
2014-11-01 00:00:00          1.121889
2014-11-01 00:01:00          1.121889
2014-11-01 00:02:00          1.121889
2014-11-01 00:03:00          1.121889
2014-11-01 00:04:00          1.118503
2014-11-01 00:05:00          1.121889
2014-11-01 00:06:00          1.121889
2014-11-01 00:07:00          1.121889
2014-11-01 00:08:00               NaN
2014-11-01 00:09:00          1.121889
2014-11-01 00:10:00          1.121889

更通用的解决方案是通过minmax datetime重新索引,但它取决于您的数据:

df = df.reindex(pd.date_range(df.index.min(), df.index.max(), freq="1min"))
print (df)
                     NSERC_CB04_A0401
2014-11-01 00:00:00          1.121889
2014-11-01 00:01:00          1.121889
2014-11-01 00:02:00          1.121889
2014-11-01 00:03:00          1.121889
2014-11-01 00:04:00          1.118503
2014-11-01 00:05:00          1.121889
2014-11-01 00:06:00          1.121889
2014-11-01 00:07:00          1.121889
2014-11-01 00:08:00               NaN
2014-11-01 00:09:00          1.121889
2014-11-01 00:10:00          1.121889

如果索引中存在重复值,解决方案是使用resample函数并结合一些聚合函数,例如meansum。详细信息请参见resample文档

print (df)
                     NSERC_CB04_A0401
DateTime                             
2014-11-01 00:00:00          1.121889
2014-11-01 00:01:00          1.121889
2014-11-01 00:02:00          1.121889
2014-11-01 00:03:00          1.121889
2014-11-01 00:04:00          1.118503
2014-11-01 00:05:00          1.121889
2014-11-01 00:06:00          1.121889
2014-11-01 00:07:00          1.121889 <- duplicates index
2014-11-01 00:07:00          1.121889 <- duplicates index
2014-11-01 00:09:00          1.121889
2014-11-01 00:10:00          1.121889

df = df.resample('1min').mean()
print (df)
                     NSERC_CB04_A0401
DateTime                             
2014-11-01 00:00:00          1.121889
2014-11-01 00:01:00          1.121889
2014-11-01 00:02:00          1.121889
2014-11-01 00:03:00          1.121889
2014-11-01 00:04:00          1.118503
2014-11-01 00:05:00          1.121889
2014-11-01 00:06:00          1.121889
2014-11-01 00:07:00          1.121889
2014-11-01 00:08:00               NaN
2014-11-01 00:09:00          1.121889
2014-11-01 00:10:00          1.121889

谢谢,如果我只有2列,那么这个方法是有效的。但是当我在我的有12列的代码中尝试时,出现了一个错误:“ValueError:无法从重复的轴重新索引”。 - acb
再次感谢,非常有帮助。最后一个问题是,我该如何使用np.nan在缺失数据行中提供NaN值?现在我只是得到了一个空行,而不是NaN。 - acb
我不明白你得到的是NaN值、空值还是空字符串? - jezrael
是的,它会填充缺失的时间,但会给出空行而不是NaN。 - acb
很有趣,我不知道问题可能是什么。 - jezrael
好的,如果问题仍然存在并且您的数据不是机密的话,您可以将CSV文件发送到我的个人资料中的电子邮件地址,明天我会尝试找到解决方案。看起来您的真实数据出现了一些问题。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接