Как вы изолируете ночные периоды, которые выпадают между днями, так как нужные вам периоды не все в один и тот же день? - PullRequest
0 голосов
/ 14 января 2019

Я хочу выбрать периоды, которые выпадают на ночь. Так, например, вечер 27 апреля будет проходить с (скажем) 2017-04-27 с 18:00 до 2017-04-28 в 06:30.

В настоящее время я запускаю цикл for, который извлекает даты из Dataframe с именем data_input

for dates in data_input.index:

Я думаю, что хочу создать маску, которая будет делать что-то со следующими терминами, но я не уверен, как именно их объединить;

data_input.index.date == dates 
data_input.index.hour >18

&

data_input.index.date == dates+timedelta(days=1)
data_input.index.hour <6

Так что я думаю, мой вопрос, как правильно их объединить.

Ради MVE вот первые 40 строк data_input

data_input.head(40)= 
2017-04-27 00:30:00    13.94
2017-04-27 01:30:00    14.88
2017-04-27 02:30:00    15.24
2017-04-27 03:30:00    15.94
2017-04-27 04:30:00    16.42
2017-04-27 05:30:00    16.12
2017-04-27 06:30:00    15.61
2017-04-27 07:30:00    14.96
2017-04-27 08:30:00    14.56
2017-04-27 09:30:00    13.86
2017-04-27 10:30:00    13.24
2017-04-27 11:30:00    13.43
2017-04-27 12:30:00    13.43
2017-04-27 13:30:00    13.12
2017-04-27 14:30:00    13.06
2017-04-27 15:30:00    12.99
2017-04-27 16:30:00    12.92
2017-04-27 17:30:00    12.88
2017-04-27 18:30:00    12.74
2017-04-27 19:30:00    12.72
2017-04-27 20:30:00    12.96
2017-04-27 21:30:00    13.18
2017-04-27 22:30:00    13.55
2017-04-27 23:30:00    14.31
2017-04-28 00:30:00    15.14
2017-04-28 01:30:00    15.77
2017-04-28 02:30:00    15.88
2017-04-28 03:30:00    15.92
2017-04-28 04:30:00    16.51
2017-04-28 05:30:00    17.06
2017-04-28 06:30:00    16.99
2017-04-28 07:30:00    16.42
2017-04-28 08:30:00    15.88
2017-04-28 09:30:00    15.34
2017-04-28 10:30:00    14.92
2017-04-28 11:30:00    14.81
2017-04-28 12:30:00    14.60
2017-04-28 13:30:00    14.29
2017-04-28 14:30:00    14.06
Name: Temperature (°C), dtype: float64

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете использовать:

for dates in data_input.index:
    #remove times (set to 00:00:00)
    d = dates.floor('d')
    #add timedeltas
    today = d + pd.Timedelta(18, unit='h')
    tomorrow = d + pd.Timedelta(1, unit='d') + pd.Timedelta(6, unit='h')
    #filtering 
    night_data = data_input.loc[today : tomorrow]
    print (night_data)
0 голосов
/ 14 января 2019

Получается, что написание вопроса помогло мне подумать о том, как на самом деле это сделать.

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

По сути, решение состоит в том, чтобы создать две маски: одну для ночи, которая есть, а другую для раннего утра следующего дня и объединить их вместе.

for dates in data_input.index:
    night_mask = (data_input.index.date+timedelta(days=1) == dates.date())& (data_input.index.hour >18)
    morning_mask = (data_input.index.date == dates.date())& (data_input.index.hour <6)
    night_data = pd.concat( [data_input[night_mask], data_input[morning_mask]] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...