2017-02-08 5 views
0

В Pandas существует ли групповая операция для группировки значений в течение нескольких лет, когда остальная часть метки времени одинакова?Pandas dataframe: группа через годы

Например, 12:00:00 01.01.2000, 12:00:00 01/01/2001 и 12:00:00 01/01/2002 сформирует группу, а также 15:00:00 01.01.2000, 15:00:00 01.01.2001 15:00:00 и 01/01/2002 ... и т.д.

Я вроде этого добиться с:

group = pd.groupby(timeseries, by=[timeseries.index.minute, timeseries.index.hour, timeseries.index.day, timeseries.index.month])

, но это действительно уродливое и не гибкое для формата входного времени. То, что я действительно хочу, - это способ исключить год из группы, но включая все остальное.

+0

Не уверен, что это некрасиво и не гибкий здесь, не могли бы вы уточнить ваш вопрос почему он не работает достаточно хорошо? – Boud

+0

Негибким и уродливым я действительно имел в виду тот факт, что если разрешение данных временных рядов меньше минуты, скажем, второе, это не сработает, так как будет сгруппировано несколько данных. Хотя маловероятно в моем использовании, я хочу попытаться охватить как можно больше потенциальных ситуаций. Очевидно, что я мог бы просто включить timeseries.index.second на фронт (и т. Д.), Но для меньшего и меньшего разрешения он становится немного глупым. Я надеялся на более элегантный способ сделать это, что не зависит от разрешения входных данных. – EngStan

ответ

1

Вы можете установить некоторую постоянную year, а затем groupby по index:

timeseries.index = timeseries.index.map(lambda t: t.replace(year=2010)) 
print (timeseries) 
group = timeseries.groupby(level=0).sum() 
print (group) 
1

Вы можете вычесть от времени штамп для начала каждого года, чтобы создать TimedeltaIndex. Один из способов сделать это в векторизованного образом преобразования в другой тип временным разрешением datetime64 с NumPy, например,

>>> idx = pd.date_range('2000-01-01', periods=1000) 

>>> idx 
DatetimeIndex(['2001-01-01', '2001-01-02', '2001-01-03', '2001-01-04', 
       '2001-01-05', '2001-01-06', '2001-01-07', '2001-01-08', 
       '2001-01-09', '2001-01-10', 
       ... 
       '2003-09-18', '2003-09-19', '2003-09-20', '2003-09-21', 
       '2003-09-22', '2003-09-23', '2003-09-24', '2003-09-25', 
       '2003-09-26', '2003-09-27'], 
       dtype='datetime64[ns]', length=1000, freq='D') 

# note that pandas only handles datetime64[ns], so we convert back 
# using pd.to_datetime 

>>> deltas = idx - pd.to_datetime(idx.values.astype('datetime64[Y]')) 

>>> deltas 
TimedeltaIndex([ '0 days', '1 days', '2 days', '3 days', '4 days', 
        '5 days', '6 days', '7 days', '8 days', '9 days', 
       ... 
       '260 days', '261 days', '262 days', '263 days', '264 days', 
       '265 days', '266 days', '267 days', '268 days', '269 days'], 
       dtype='timedelta64[ns]', length=1000, freq=None) 

>>> group = pd.Series(np.arange(1000), idx).groupby(deltas) 

Одна вещь, чтобы следить за это високосных лет - вы будете в конечном итоге с несколькими свисающие с датой разницы 365-366 дней.

0

Что-то вроде этого?

t = pd.Series(['12:00:00 01/01/2000', '12:00:00 01/01/2001' ,'12:00:00 01/01/2002' ,'15:00:00 01/01/2000', '15:00:00 01/01/2001','15:00:00 01/01/2002']) 
df = pd.DataFrame(t.str.split(' ',1).tolist(), 
           columns = ['Time','Date']) 
df.groupby(['Time', 'Date']).required_function() 

Вы получаете данные сгруппированы по времени, а затем Дата