Посчитать дни, но начать их с заданного часа - PullRequest
1 голос
/ 26 июня 2019

У меня есть таблица этого формата:

                 date
0 2017-03-30 09:59:00
1 2017-03-30 09:59:30
2 2017-03-30 10:00:00
3 2017-03-30 10:00:30
4 2017-03-30 10:01:00
5 2017-03-30 10:01:30
6 2017-03-30 10:02:00

Что я хотел бы сделать, так это подсчитать дни в моей таблице (начиная с 1), а не начиная с полуночи, Я бы хотел, чтобы мои дни начинались в 10: 00: 00, Таким образом, для таблицы выше, результат будет:

                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1

Пока мне удалось создать новый столбец со следующим кодом:

d=1
hour_before = 10
col_days = []
for row in df.itertuples(): 
    if row.date.hour == 10 and hour_before != 10 : 
            d+= 1
    hour_before = row.date.hour 
    cols_days.append(d)
df['day'] = col_days

Но я бы хотел иметь более элегантный (и, что более важно, более быстрый) способ выполнить эту операцию.

Есть предложения?

1 Ответ

3 голосов
/ 26 июня 2019

Что если вы сдвинете данные обратно на 10 часов, а затем сгруппируете строки по дням? Затем вы можете использовать pd.factorize для дат, это должно быть довольно быстро.

df['day'] = pd.factorize((df['date'] - pd.Timedelta(hours=10)).dt.date)[0]
df
                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1

GroupBy.ngroup другая альтернатива:

df['day'] = df.groupby((df['date'] - pd.Timedelta(hours=10)).dt.date).ngroup()
df
                 date  day
0 2017-03-30 09:59:00    0
1 2017-03-30 09:59:30    0
2 2017-03-30 10:00:00    1
3 2017-03-30 10:00:30    1
4 2017-03-30 10:01:00    1
5 2017-03-30 10:01:30    1
6 2017-03-30 10:02:00    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...