Сумма осадков за таймфрейм во фрейме данных pandas

#python #numpy #pandas

#python #numpy #pandas

Вопрос:

У меня есть pandas Dataframe с индексом DateTime. Интервал между данными составляет 5 минут. Для каждого у меня есть данные об осадках из датчика осадков Хеллмана. Имеющиеся у меня данные показывают не фактическое количество осадков в мм, а высоту воды в датчике. Итак, если я хочу иметь данные об осадках за час, мне нужно проверить все строки за этот час, есть ли разница между текущим и предыдущим измерением. Если да, то подведите итог. Но есть еще одно предостережение, если уровень воды в датчике достигает 100 мм, датчик будет автоматически опорожнен, и весь процесс начнется с самого начала.

если tprep — (tprep-1) > 0, берем дельту

если tprep < (tprep-1), берем 100 — (tprep-1) tprep

если tprep = (tprep-1) ничего не делать

Данные:

 8:00 78
8:05 78
8:10 82
8:15 82
8:20 82
8:25 90
8:30 91
8:35 91
8:40 98
8:45  3
8:50  3
8:55  5
  

Это должно составить 27 мм осадков за этот час. Конечно, она может в несколько раз превысить 100 на таймфрейме, особенно если таймфрейм больше. Кто-нибудь знает эффективный способ получить сумму осадков из такого набора данных?

Комментарии:

1. Все условия могут быть описаны как delta = (100 tprep - (tprep-1)) mod 100

Ответ №1:

Все ваши три условия можно описать как одно delta = (100 tprep - (tprep-1)) mod 100
или даже как delta = (tprep - (tprep-1)) mod 100

 import pandas as pd
from StringIO import StringIO

data = """8:00 78
8:05 78
8:10 82
8:15 82
8:20 82
8:25 90
8:30 91
8:35 91
8:40 98
8:45 3
8:50 3
8:55 5"""

df = pd.read_csv(StringIO(data), sep=' ' , header=None)

df[1] = df[1].apply(int)
  

теперь у меня есть фрейм данных для работы

 df['diff'] = df[1].diff()
df['diff_modulo'] = df['diff'].mod(100)

print df
  

.

        0   1  diff  diff_modulo
0   8:00  78   NaN          NaN
1   8:05  78     0            0
2   8:10  82     4            4
3   8:15  82     0            0
4   8:20  82     0            0
5   8:25  90     8            8
6   8:30  91     1            1
7   8:35  91     0            0
8   8:40  98     7            7
9   8:45   3   -95            5
10  8:50   3     0            0
11  8:55   5     2            2
  

.

 print df['diff_modulo'].sum()
  

.

 27.0
  

Конечно, вы можете получить это за один ход

 print df[1].diff().mod(100).sum()
  

Комментарии:

1. Такое простое решение. Большое спасибо! Однако еще один вопрос. У меня есть данные за четыре недели и сумма осадков в настоящее время на почасовой основе. Это дает мне много часов с 0 осадками. Проблема в том, что когда я пытаюсь отобразить такой большой фрейм данных в виде столбчатой диаграммы, pandas / matplotlib пытается также отобразить значения 0, а график бесполезен. у вас есть идея, как это решить? должен ли я заменить все значения 0 на np.nan? Спасибо

2. Что касается моего последнего вопроса, замена всех значений 0 на nan работает. df [‘diff_modulo’][df [‘diff_modulo’] == 0] = np.nan конечно, я сделал это после повторной выборки фрейма данных