суммирование только данных, отличных от NaN, во временных рядах с помощью python

Мне нужна сумма ежедневных значений, но только из тех дней, которые не содержат значений 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')

Кто-нибудь знает, как это сделать?


person Thomas Sockel    schedule 16.08.2013    source источник
comment
nansum? Я на самом деле не знаю панд, но это похоже на инструмент для использования.   -  person user2357112 supports Monica    schedule 16.08.2013
comment
вы можете попробовать преобразовать nan в 0, а затем подвести итог.   -  person heretolearn    schedule 16.08.2013


Ответы (2)


Если я правильно понимаю, вы хотите отфильтровать все данные за любые дни, содержащие NaN, а затем суммировать дни с полным набором данных без NaN.

Для простоты сделайте его Серией, а не DataFrame, используя ключевое слово 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')
person Dan Allan    schedule 16.08.2013
comment
Спасибо за Ваш ответ! Но я получаю ошибки: если я отбрасываю parse_dates=[['date', 'time']] в строке pd.read.csv..., возникает ошибка: AttributeError: объект 'str' не имеет атрибута 'date' . Если я его не брошу, возникает ошибка: AttributeError: объект SeriesGroupBy не имеет атрибута filter. - person Thomas Sockel; 17.08.2013
comment
SeriesGroupBy не имеет атрибута filter означает, что вы используете старую версию панд без фильтра. Обновите установку pandas, если можете; в противном случае покопайтесь в моих старых ответах в поисках обходного пути, используя transform. (Я часто отвечаю на фильтрующие вопросы здесь.) - person Dan Allan; 17.08.2013

В этом случае, я думаю, вы хотите использовать:

ts.dropna()

person Dav Clark    schedule 17.08.2013