【问题标题】:Python Pandas: Groupby date, and accessing each group by timestampPython Pandas:按日期分组,并按时间戳访问每个组
【发布时间】: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

【问题讨论】:

    标签: python datetime group-by timestamp pandas


    【解决方案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(最近一次调用最后一次):
      文件“”,第 1 行,在
      文件“C:\Python27\lib \site-packages\pandas\core\groupby.py",第 278 行,在 get_group
      inds = self.indices[name]
      KeyError: 1381449600000000000
    • 我已经在 2 台不同的机器上尝试过,win32 和 win64,但都不起作用。 Python 2.7 和熊猫 0.12。这是 Windows 问题吗?
    • 部分是 Windows 问题,试试这个:g.get_group(long(key.astype('i8')))。 astypeing 返回一个np.int64,由于某种原因,它在Windows 上不能正确地与long 进行比较。
    • 这里有一个问题可以更好地处理这个问题。 github.com/pydata/pandas/issues/5267
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2018-09-04
    • 2017-01-16
    相关资源
    最近更新 更多