Как манипулировать значениями в столбце датафрейма с указанием c раз за каждый день в пределах фрейма данных - PullRequest
0 голосов
/ 13 марта 2020

Итак, у меня есть индексированный фрейм данных datetime, который выглядит следующим образом:

eventTime   Energy  Power   RunningHours
9/29/2018 0:00  146.985 65  2256.88
9/29/2018 1:00  147.05  64.5    2257.87
9/29/2018 2:00  147.116 65  2258.87
9/29/2018 3:00  147.181 65  2259.87
9/29/2018 4:00  147.246 65  2260.87
9/29/2018 5:00  147.312 65  2261.87
9/29/2018 5:11  76.428      
9/29/2018 5:12      65  
9/29/2018 6:00  147.377 65  2262.87
9/29/2018 7:00  147.443 65  2263.87
9/29/2018 8:00  147.45      2263.98
9/29/2018 9:17  76.558      
9/29/2018 9:17          1174.35
9/29/2018 19:00 147.502 65  2264.75
9/29/2018 20:00 147.567 65  2265.75
9/29/2018 21:00 147.633 65  2266.75
9/29/2018 22:00 147.698 65  2267.75
9/29/2018 23:00 147.764 65  2268.75
9/30/2018 0:00  147.829 65  2269.75
9/30/2018 1:00  147.895 65  2270.75
9/30/2018 2:00  147.961 65  2271.75
9/30/2018 3:00  148.026 65  2272.73
9/30/2018 4:00  148.092 65  2273.73
9/30/2018 5:00  148.157 65  2274.73
9/30/2018 6:00  148.223 65  2275.73
9/30/2018 7:00  148.288 65  2276.73
9/30/2018 8:00  148.297     2276.87
9/30/2018 13:51     64  
9/30/2018 19:00 148.35  65  2277.68
9/30/2018 20:00 148.415 65  2278.67
9/30/2018 21:00 148.481 65  2279.67
9/30/2018 22:00 148.546 65  2280.67
9/30/2018 23:00 148.611 65  2281.67

Для каждого дня в индексе datetime я ищу разницу между значением «RunningHours» в 23 часа и 0 ч.

Я представляю, что мой вывод выглядит как

9/29/2018   11.87
9/30/2018   11.92

Как мне добраться до этого. В настоящее время я разбиваю индекс даты и времени на дату и время, а затем зацикливаю дату и время, чтобы найти разницу. Кажется сложным для чего-то очень простого, и я уверен, что есть более простой способ использования индекса даты и времени, как есть. Я просто не знаю как. Помогите, пожалуйста.

@ansev Ваш код работает очень хорошо для данных, которые непрерывны и где информация существует для отметок времени 00: и 23:00. Однако, если данные для этих 2 временных отметок отсутствуют, сценарий выбирает первое доступное или последнее доступное место данных на эту дату.

Для. Например: Для данных ниже

6/7/2018 0:00   67.728  64  1037.82
6/7/2018 1:00   67.793  64  1038.82
6/7/2018 2:00   67.857  64  1039.82
6/7/2018 3:00   67.922  64  1040.82
6/7/2018 4:00   67.987  64  1041.82
6/7/2018 5:00           64  1042.82
6/7/2018 6:00               1043.43
6/7/2018 23:00  68.288      

Выходные данные из сценария:

6/7/2018    1037.82 1043.43 5.61

Как мне изменить его на NaN, если данные недоступны? Большое спасибо за вашу помощь в этом.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

при условии, что он упорядочен в хронологическом порядке, мы можем использовать groupby.agg, чтобы получить first и last для каждого date, тогда мы можем получить разницу

new_df = (df.groupby(pd.to_datetime(df['eventTime']).dt.date)['RunningHours']
            .agg(['first','last'])
            .assign(difference=lambda x: x['last']-x['first'])
            .reset_index())

print(new_df)
    eventTime    first     last  difference
0  2018-09-29  2256.88  2268.75       11.87
1  2018-09-30  2269.75  2281.67       11.92
0 голосов
/ 18 марта 2020

Найти значения из столбца в DF очень точно c раз для каждой уникальной даты

Я ответил здесь на свой вопрос для тех, кто ищет что-то другое.

...