Pandas 数据框:跨年分组
Pandas dataframe: group across years
在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])
但是真的很丑,输入时间格式也不灵活。我真正想要的是一种从 groupby 中排除年份的方法,但包括其他所有内容。
您可以设置一些常量 year
然后 groupby
通过 index
:
timeseries.index = timeseries.index.map(lambda t: t.replace(year=2010))
print (timeseries)
group = timeseries.groupby(level=0).sum()
print (group)
您可以减去每年年初的 time-stamp 以创建 TimedeltaIndex
。以矢量化方式执行此操作的一种方法是使用 NumPy 转换为不同的 time-resolution 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)
需要注意的一件事是 leap-years -- 您最终会遇到一些 365-366 天的悬空日期时间差异。
是这样的吗?
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()
您得到按时间分组的数据,然后按日期分组
在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])
但是真的很丑,输入时间格式也不灵活。我真正想要的是一种从 groupby 中排除年份的方法,但包括其他所有内容。
您可以设置一些常量 year
然后 groupby
通过 index
:
timeseries.index = timeseries.index.map(lambda t: t.replace(year=2010))
print (timeseries)
group = timeseries.groupby(level=0).sum()
print (group)
您可以减去每年年初的 time-stamp 以创建 TimedeltaIndex
。以矢量化方式执行此操作的一种方法是使用 NumPy 转换为不同的 time-resolution 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)
需要注意的一件事是 leap-years -- 您最终会遇到一些 365-366 天的悬空日期时间差异。
是这样的吗?
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()
您得到按时间分组的数据,然后按日期分组