Python Pandas:按日期分组,并按时间戳访问每个组

2024-05-19 06:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按时间戳(日期)分组并按时间戳访问每个组,这看起来不正常。 看起来组键以不同的格式被奇怪地编入索引。

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

Tags: tonumpydfdatetimedate时间valkeys
1条回答
网友
1楼 · 发布于 2024-05-19 06:22:08

这是你的相框

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'):
        ......

相关问题 更多 >

    热门问题