dt.floor count за каждые 12 часов в Pandas - PullRequest
2 голосов
/ 06 августа 2020

Я пытаюсь подсчитывать количество datetime каждые 12 часов следующим образом, используя dt.floor. Здесь я создал фрейм данных, содержащий 2 дня с 1-часовыми интервалами. У меня есть два вопроса относительно вывода.

  1. Я ожидаю, что сводка будет за каждые 12 часов, т.е. первая строка в output1 должна быть 12:00, а вторая строка - 24 : 00. Вместо этого я получаю 00:00 и 12:00. Почему это?

  2. Можно ли создать сводку, используя указанное c время? например, считать каждые 6 утра и 6 вечера?

код и вход

input1 = pd.DataFrame(pd.date_range('1/1/2018 00:00:00', periods=48, freq='H'))
input1.columns = ["datetime"]
input1.groupby(input1['datetime'].dt.floor('12H')).count()

выход-1

    datetime
datetime    
2018-01-01 00:00:00 12
2018-01-01 12:00:00 12
2018-01-02 00:00:00 12
2018-01-02 12:00:00 12

выход-2

    datetime
datetime    
2018-01-01 06:00:00 6
2018-01-01 18:00:00 12
2018-01-02 06:00:00 12
2018-01-02 18:00:00 6

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

24-го часа нет. Часть времени datetime в pandas существует в диапазоне [00:00:00, 24:00:00), что гарантирует, что существует только одно представление одного и того же точного времени. (Обратите внимание на закрытие).

import pandas as pd

pd.to_datetime('2012-01-01 24:00:00')
#ParserError: hour must be in 0..23: 2012-01-01 24:00:00

Для второй точки с pd.__version__ == '1.1.0' вы можете указать параметр offset при передискретизации. Вы также можете указать, какую сторону использовать для этикеток. Для более старых версий вам нужно будет использовать аргумент base.

# pandas < 1.1.0
#input1.resample('12H', on='datetime', base=6).count()

input1.resample('12H', on='datetime', offset='6H').count()
#                     datetime
#datetime                     
#2017-12-31 18:00:00         6
#2018-01-01 06:00:00        12
#2018-01-01 18:00:00        12
#2018-01-02 06:00:00        12
#2018-01-02 18:00:00         6

# Change labels
input1.resample('12H', on='datetime', offset='6H', label='right').count()
#                     datetime
#datetime                     
#2018-01-01 06:00:00         6
#2018-01-01 18:00:00        12
#2018-01-02 06:00:00        12
#2018-01-02 18:00:00        12
#2018-01-03 06:00:00         6
1 голос
/ 06 августа 2020

Я немного изменил ваши входные данные, чтобы использовать resample:

import pandas as pd

input1 = pd.DataFrame(pd.date_range('1/1/2018 00:00:00', periods=48, freq='H'))
input1.columns = ["datetime"]

# add a dummy column
input1['x'] = 'x'

# convert datetime to index...
input1 = input1.set_index('datetime')

# ...so we can use resample, and loffset lets us start at 6 am
t = input1.resample('12h', loffset=pd.Timedelta(hours=6)).count()

# show results
print(t.head())

                      x
datetime               
2018-01-01 06:00:00  12
2018-01-01 18:00:00  12
2018-01-02 06:00:00  12
2018-01-02 18:00:00  12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...