Получить отметку времени окончания периода в Пандах при использовании Grouper - PullRequest
0 голосов
/ 02 мая 2018

У меня есть фрейм данных, в котором один столбец является метками времени. Пример:

                week                     Energy        Value
1152 2018-01-09 00:00:00                  None        0.000000   
1153 2018-01-09 00:10:00                  None        0.000000   
1154 2018-01-09 00:20:00                  None      104.000000   
1155 2018-01-09 00:30:00                  None      104.049080   
1156 2018-01-09 00:40:00                  None        0.000000   
1157 2018-01-09 00:50:00                  None        0.000000   
1158 2018-01-09 01:00:00                  None       46.428571   
1159 2018-01-09 01:10:00                  None        0.000000   
1160 2018-01-09 01:20:00                  None        0.000000   
1161 2018-01-09 01:30:00                  None      113.846154   
1162 2018-01-09 01:40:00                  None      126.108374   
1163 2018-01-09 01:50:00                  None        0.000000   
1164 2018-01-09 02:00:00                  None       35.398230   
1165 2018-01-09 02:10:00                  None        0.000000   
1166 2018-01-09 02:20:00                  None        0.000000   
1167 2018-01-09 02:30:00                  None       71.937984   
1168 2018-01-09 02:40:00                  None        0.000000   
1169 2018-01-09 02:50:00                  None        0.000000   
1170 2018-01-09 03:00:00                  None       30.877193   
1171 2018-01-09 03:10:00                  None        0.000000 

Теперь я группирую его по этому столбцу, используя pd.Grouper, но он возвращает дату и время, соответствующие концу периода группировки. Это мой запрос

df = df.groupby([pd.Grouper(key=timestamp, freq='W'), 'ID'])

Возвращает:

week                   Count      
2018-01-07               984  
2018-01-14               566  
2018-01-21               725  
2018-01-28               815  
2018-02-04               774  
2018-02-11               648  
2018-02-18               807  
2018-02-25               804  
2018-03-04               967  
2018-03-11               953

Это уже очень запутанно, потому что использование freq='W' возвращает обычные недели с понедельника по понедельник, т. Е. Недели , заканчивающиеся в воскресенье, а не недели , начинающиеся в воскресенье, как я бы предположил. Конечно, документация не имеет смысла, потому что все, что там говорится, это "еженедельная частота (воскресенья)".

Мой основной вопрос: как сделать так, чтобы столбец меток времени (после группировки) возвращал метку времени, соответствующую началу периода? Это необходимо, потому что мне нужно объединить этот фрейм данных с другим фреймом данных, где периоды генерируются с использованием pd.date_range(start, end, freq='W-MON'). Я не могу объединить его с отметкой времени окончания, поскольку последняя не возвращает конец недели, скорее, она возвращает значение, равное end, которое может быть серединой недели.

Кроме того, кто-нибудь знает, почему поведение freq отличается для pd.Grouper и pd.date_range? Последний возвращает неделю с понедельника по понедельник, но с freq='W-MON', тогда как первый использует freq='W' для того же самого. Или я что-то упустил?

1 Ответ

0 голосов
/ 11 мая 2018

Вы просто хотите использовать аргумент label, равный pandas.Grouper, который говорит ему использовать левую границу для маркировки, когда вы предоставляете аргумент freq. Вот как меняется неделя маркировки с этим аргументом и без него для df, который вы указали.

import pandas as pd

df.groupby([pd.Grouper(key='week', freq='W-MON', label='left')]).Value.max()
#week
#2018-01-08    126.108374
#Freq: W-MON, Name: Value, dtype: float64

# Without label, it sets the label as the 
df.groupby([pd.Grouper(key='week', freq='W-MON')]).Value.max()
#week
#2018-01-15    126.108374
#Freq: W-MON, Name: Value, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...