在groupby操作中保留日期时间索引

时间:2012-11-13 13:10:41

标签: python pandas

假设我有以下DataFrame(时间序列,第一列是DateTimeIndex)

                           atn   file
datetime                             
2012-10-08 14:00:00  23.007462      1
2012-10-08 14:30:00  27.045666      1
2012-10-08 15:00:00  31.483825      1
2012-10-08 15:30:00  37.540651      2
2012-10-08 16:00:00  43.564573      2
2012-10-08 16:00:00  48.589852      2
2012-10-08 16:00:00  55.289452      2

我的目标是在最后一列“文件”中提取具有特定数字的第一个外观的行,因此获取与此类似的表

       datetime             atn
file                             
1      2012-10-08 14:00:00  23.007462
2      2012-10-08 15:30:00  37.540651

我的方法是分组'文件'然后聚合'第一':

dt.groupby(by="file").aggregate("first")

但问题是,那么索引不会被用作分组的列。我通过首先将索引添加为列来解决这个问题:

dt2 = dt.reset_index()
dt2.groupby(by="file").aggregate("first")

但现在问题是日期时间列不再是日期而是浮动:

          datetime        atn
file                         
1     1.349705e+18  23.007462
2     1.349710e+18  37.540651

有吗

  • 一种将浮动转换回日期时间的方法吗?
  • 或者是一种在groupby / aggregate-operation中保留日期时间的方法吗?
  • 或者更好的方法来实现这个最终的表格?

示例数据框可以按如下方式使用:

复制(到剪贴板):

2012-10-08 14:00:00,  23.007462,     1
2012-10-08 14:30:00,  27.045666,     1
2012-10-08 15:00:00,  31.483825,     1
2012-10-08 15:30:00,  37.540651,     2
2012-10-08 16:00:00,  43.564573,     2
2012-10-08 16:00:00,  48.589852,     2
2012-10-08 16:00:00,  55.289452,     2

然后:

dt = pandas.read_clipboard(sep=",", parse_dates=True, index_col=0, 
                           names=["datetime", "atn", "file"])

3 个答案:

答案 0 :(得分:1)

我认为这是pandas中的一个错误 - 在groupby之后dtype被更改为float

dt3 = dt2.groupby(by="file").aggregate("first")
dt3.dtypes

给我:

datetime    float64
atn         float64

要将dtype更改回datetime64,您可以执行以下操作:

dt3['datetime'] = pd.Series(dt3['datetime'], dtype='datetime64[ns]')

我在GitHub

上创建了一个新问题

答案 1 :(得分:0)

看起来像一个错误,但此时未指定 parse_dates=True会给我预期的结果。

我的ipython结果 - 没有parse_dates=True: -

In [29]: dt2 = pd.read_clipboard(sep=",", index_col=0, 
                           names=["datetime", "atn", "file"])

In [30]: dt2
Out[30]: 
                           atn  file
datetime                            
2012-10-08 14:00:00  23.007462     1
2012-10-08 14:30:00  27.045666     1
2012-10-08 15:00:00  31.483825     1
2012-10-08 15:30:00  37.540651     2
2012-10-08 16:00:00  43.564573     2
2012-10-08 16:00:00  48.589852     2
2012-10-08 16:00:00  55.289452     2

In [31]: dt2.reset_index().groupby(by="file").aggregate("first")
Out[31]: 
                 datetime        atn
file                                
1     2012-10-08 14:00:00  23.007462
2     2012-10-08 15:30:00  37.540651

In [32]: 

我的ipython结果,parse_dates=True: -

In [33]: dt = pd.read_clipboard(sep=",", parse_dates=True, index_col=0, 
                           names=["datetime", "atn", "file"])
KeyboardInterrupt

In [33]: dt = pd.read_clipboard(sep=",", parse_dates=True, index_col=0, 
                           names=["datetime", "atn", "file"])

In [34]: dt.reset_index().groupby(by="file").aggregate("first")
Out[34]: 
          datetime        atn
file                         
1     1.349705e+18  23.007462
2     1.349710e+18  37.540651

明确检查dtypes: -

In [40]: new_dt = dt.reset_index().groupby(by="file").aggregate("first")

In [41]: new_dt
Out[41]: 
          datetime        atn
file                         
1     1.349705e+18  23.007462
2     1.349710e+18  37.540651

In [42]: new_dt.dtypes
Out[42]: 
datetime    float64
atn         float64

In [43]: new_dt2 = dt2.reset_index().groupby(by="file").aggregate("first")

In [44]: new_dt2.dtypes
Out[44]: 
datetime     object
atn         float64

答案 2 :(得分:0)

我相信这是固定的,将在0.9.1发布中

相关问题