Python Pandas:按日期分组,并按时间戳访问每个组
Posted
技术标签:
【中文标题】Python Pandas:按日期分组,并按时间戳访问每个组【英文标题】:Python Pandas: Groupby date, and accessing each group by timestamp 【发布时间】:2013-10-27 19:27:29 【问题描述】:我想按时间戳(日期)分组并按时间戳访问每个组,这看起来无法正常工作。 看起来组键以不同的格式进行了奇怪的索引。
df= pd.DataFrame('DATE' : ['10-Oct-2013', '10-Oct-2013', '10-Oct-2013', '11-Oct-2013', '11-Oct-2013', '11-Oct-2013'],'VAL' : [1,2,3,4,5,6])
>>> df
DATE VAL
0 10-Oct-2013 1
1 10-Oct-2013 2
2 10-Oct-2013 3
3 11-Oct-2013 4
4 11-Oct-2013 5
5 11-Oct-2013 6
dfg=df.groupby(df['DATE'].apply(lambda x: pd.to_datetime(x)))
>>> dfg.groups.keys()
[numpy.datetime64('NaT'), numpy.datetime64('2013-10-10T17:00:00.000000000-0700'), numpy.datetime64('2013-10-09T17:00:00.000000000-0700')]
for d in dfg.groups.keys():
try:
print d,dfg.get_group(d).describe()
except:
print 'err'
>>
NaT err
2013-10-10T17:00:00.000000000-0700 err
2013-10-09T17:00:00.000000000-0700 err
rng = pd.to_datetime(pd.date_range('10/10/2013', periods=3, freq='D'))
for d in rng:
try:
print d,dfg.get_group(d).describe()
except:
print 'err'
2013-10-10 00:00:00 err
2013-10-11 00:00:00 err
2013-10-12 00:00:00 err
【问题讨论】:
【参考方案1】:这是你的框架
In [40]: df = pd.DataFrame('DATE' : ['10-Oct-2013', '10-Oct-2013', '10-Oct-2013', '11-Oct-2013', '11-Oct-2013', '11-Oct-2013'],'VAL' : [1,2,3,4,5,6])
直接转换类似日期的列要快得多
In [41]: df['DATE']= pd.to_datetime(df['DATE'])
In [42]: df.dtypes
Out[42]:
DATE datetime64[ns]
VAL int64
dtype: object
In [43]: df
Out[43]:
DATE VAL
0 2013-10-10 00:00:00 1
1 2013-10-10 00:00:00 2
2 2013-10-10 00:00:00 3
3 2013-10-11 00:00:00 4
4 2013-10-11 00:00:00 5
5 2013-10-11 00:00:00 6
这完成了它看起来像你想要的
In [44]: df.groupby('DATE').describe()
Out[44]:
VAL
DATE
2013-10-10 count 3.0
mean 2.0
std 1.0
min 1.0
25% 1.5
50% 2.0
75% 2.5
max 3.0
2013-10-11 count 3.0
mean 5.0
std 1.0
min 4.0
25% 4.5
50% 5.0
75% 5.5
max 6.0
如果你真的想单独组队
In [45]: g = df.groupby('DATE')
In [46]: key = g.groups.keys()[0]
In [47]: key
Out[47]: numpy.datetime64('2013-10-09T20:00:00.000000000-0400')
In [48]: g.get_group(key.astype('i8'))
Out[48]:
DATE VAL
0 2013-10-10 00:00:00 1
1 2013-10-10 00:00:00 2
2 2013-10-10 00:00:00 3
datetime64[ns] 在内部存储为长整数,因此需要访问它们 你通常真的没有理由这样做,因为你可以这样做
df.groupby('DATE').apply(lambda x: .....)
或者如果你真的想迭代
for g, grp in df.groupby('DATE'):
......
【讨论】:
感谢您的快速回答。但我收到了以下错误消息: Traceback(最近一次调用最后一次):文件“g.get_group(long(key.astype('i8')))
。 astypeing 返回一个np.int64
,由于某种原因,它在Windows 上不能正确地与long
进行比较。
这里有一个问题可以更好地处理这个问题。 github.com/pydata/pandas/issues/5267以上是关于Python Pandas:按日期分组,并按时间戳访问每个组的主要内容,如果未能解决你的问题,请参考以下文章