#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 конечно, я сделал это после повторной выборки фрейма данных