групповая дата с использованием времени начала, отличного от полуночи - PullRequest
0 голосов
/ 01 октября 2019

Я собираю некоторые данные по дате.

for dt,group in df.groupby(df.timestamp.dt.date):
      # do stuff

Теперь я хотел бы сделать то же самое, но без использования полуночи в качестве временного смещения. Тем не менее, я хотел бы использовать групповые, но, например, в 6 утра-6 утра бункеров. Есть ли лучшее решение, чем пустышка? к сожалению, повторная выборка, как описано в

Повторная выборка ежедневных серий времени панд с началом во время, отличное от полуночи Повторная выборка ежечасно TimeSeries с определенным начальным часом

неработать, так как мне нужно применить любую функцию передискретизации / агрегирования

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Вы можете, например, вычесть смещение перед группировкой:

for dt, group in df.groupby(df.timestamp.sub(pd.to_timedelta('6H')).dt.date):
    # do stuff
1 голос
/ 01 октября 2019

Существует аргумент base для resample или pd.Grouper, который предназначен для обработки этой ситуации. Есть много способов сделать это, выберите то, что вам кажется более ясным.

  • 1D частота с base=0.25
  • '24h' частота с base=6
  • частота '1440мин' с base=360

Код

df = pd.DataFrame({'timestamp': pd.date_range('2010-01-01', freq='10min', periods=200)})

df.resample(on='timestamp', rule='1D', base=0.25).timestamp.agg(['min', 'max'])
#df.resample(on='timestamp', rule='24h', base=6).timestamp.agg(['min', 'max'])
#df.resample(on='timestamp', rule=f'{60*24}min', base=60*6).timestmap.agg(['min', 'max'])

                                    min                 max
timestamp                                                  
2009-12-31 06:00:00 2010-01-01 00:00:00 2010-01-01 05:50:00  #[Dec31 6AM - Jan1 6AM)
2010-01-01 06:00:00 2010-01-01 06:00:00 2010-01-02 05:50:00  #[Jan1 6AM - Jan2 6AM)
2010-01-02 06:00:00 2010-01-02 06:00:00 2010-01-02 09:10:00  #[Jan2 6AM - Jan3 6AM)

Для полноты resample является удобным методом иво всех отношениях такой же, как groupby. Если по какой-то причине вы абсолютно не можете использовать resample, вы можете сделать:

for dt, gp in df.groupby(pd.Grouper(key='timestamp', freq='24h', base=6)):
    ...

, что эквивалентно

for dt, gp in df.resample(on='timestamp', rule='24h', base=6):
    ...
...