【问题标题】:summing up only non NaN Data in timeseries with python用python总结时间序列中的非NaN数据
【发布时间】:2013-08-19 05:56:00
【问题描述】:

我需要每日值的总和,但只需要不包含 NaN 值的天数。我的 csv 文件包含半小时数据,但有时测量设备会失败。我需要每日总和,但只要它包含 NaN 值,我就不想用它来总结这一天。 我的 CSV 文件如下所示:

date        time       ET
28. Nov 01  08:15   -0.00152
28. Nov 01  08:45   -0.00324
28. Nov 01  09:15   0.00805
28. Nov 01  09:45   0.00684
28. Nov 01  10:15   0.00918
28. Nov 01  10:45   
28. Nov 01  11:15   0.00867
28. Nov 01  11:45   0.01014
28. Nov 01  12:15   0.01697
28. Nov 01  12:45   0.00739

这一天有一个缺失值,所以我不想要这一天的总和,而是所有其他具有所有测量值的日子。

我当前的代码是这样的:

import pandas as pd
ts = pd.read_csv('C:\Python27\Scripts\ET_T_2000.csv', sep=';', parse_dates=[['date', 'time']])
ts.fillna(0)
ts1 = ts.set_index('date_time')['ET'].resample('D', how='sum')

有人知道怎么做吗?

【问题讨论】:

  • nansum?我实际上并不了解 pandas,但它看起来像是可以使用的工具。
  • 你可以尝试将nan转为0再求和。

标签: python sum pandas time-series nan


【解决方案1】:

如果我理解正确,您想过滤掉任何包含 NaN 的日期的所有数据,然后将这些天数与完整的无 NaN 数据集相加。

为简单起见,使用squeeze 关键字将其设为系列,而不是数据帧。 (这不是必需的,但它使后面的内容更直接。)

et = pd.read_csv(..., index_col=0, squeeze=True)

要过滤掉包含任何 NaN 的日期,

complete_days_only = et.groupby(lambda x: x.date).filter(lambda x: ~x.isnull().any())

现在重新采样

complete_days_only.resample('D', how='sum')

【讨论】:

  • 感谢您的回答!但我得到错误:如果我在“pd.read.csv ...”行中删除“parse_dates = [['date','time']]”,则错误:AttributeError:'str'对象没有属性“日期”出现。如果我不删除它,则会出现错误:AttributeError: 'SeriesGroupBy' object has no attribute 'filter'。
  • "SeriesGroupBy has no attribute filter" 表示您使用的是旧版本的熊猫,没有过滤器。如果可以的话,更新你的 pandas 安装;否则使用transform 挖掘我的旧答案以寻找解决方法。 (我在这里回答了很多过滤问题。)
【解决方案2】:

在这种情况下,我想你想使用:

ts.dropna()

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2016-07-08
    • 2011-02-16
    • 2013-07-28
    • 2021-11-24
    相关资源
    最近更新 更多