Для каждого дня вычтите последнюю строку времени из первой строки времени с помощью Python - PullRequest
0 голосов
/ 04 декабря 2018

У меня 5-минутный метеорологический интервал в течение многих дней.Некоторые строки и дни отсутствуют.Индекс - это формат даты и времени.

DateTime               Data
2016-01-01 07:00:00     1
2016-01-01 10:30:00     2
2016-01-01 16:55:00     3

2016-03-25 09:25:00     4
2016-03-25 11:30:00     5
2016-03-25 13:35:00     6
2016-03-25 17:40:00     7 

2017-11-09 12:00:00     8
2017-11-09 13:05:00     9
2017-11-09 16:10:00    10
2017-11-09 18:15:00    11
2017-11-09 19:20:00    12
2017-11-09 20:25:00    13

Я хочу создать новый_df из ежедневно данных со столбцом Data_diff .Столбец Data_diff должен содержать результат вычитания последних данных из первых данных каждого дня.

Ожидаемый результат:

DateTime      Data_diff
2016-01-01    2
2016-03-25    3
2017-11-09    5

Понятия не имею, что делать.Имелось в виду использовать

new_df = df.diff()

, но для этого случая это было не так.

Редактировать: я также пробую следующее

new_df = df.resample('D')['Data'].agg(['first','last'])
new_df['Data_diff'] = new_df['first'] - new_df['last']

, но результат неверный.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Используйте pandas.groupby вместе с dt.day и примените искомую функцию.

s = df.groupby(df['DateTime'].dt.day)['Data'].apply(lambda x: x.values[-1]-x.values[0])
print(s)
#           Data
# DateTime
# 1            2
# 9            5
# 25           3
0 голосов
/ 04 декабря 2018

Функция resample добавить все пропущенные дни, заполненные NaN с.

Вы можете удалить только эти дни на DataFrame.dropna:

new_df = df.resample('D')['Data'].agg(['first','last']).dropna(how='all')
new_df['Data_diff'] =  new_df['last'] - new_df['first']
print (new_df)
            first  last  Data_diff
DateTime                          
2016-01-01    1.0   3.0        2.0
2016-03-25    4.0   7.0        3.0
2017-11-09    8.0  13.0        5.0
...