熊猫数据框:跨年组

时间:2017-02-08 17:02:20

标签: python pandas python-xarray

在Pandas中,是否有一个groupby操作可以在多年内对值进行分组,其余的时间戳是相同的?

例如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])

但输入时间格式非常难看且不灵活。我真正想要的是一种将年份排除在群体之外的方式,但包括其他所有内容。

3 个答案:

答案 0 :(得分:2)

您可以减去每年年初的时间戳,以创建TimedeltaIndex。以矢量化方式执行此操作的一种方法是使用NumPy转换为不同的时间分辨率datetime64类型,例如,

>>> 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天。

答案 1 :(得分: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)

答案 2 :(得分: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()

您获得的数据按时间分组,然后是日期