2

假设我有以下 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 列不再是日期,而是浮动:

          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"])
4

3 回答 3

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 上创建了一个新问题

于 2012-11-13T14:02:05.750 回答
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
于 2012-11-13T14:46:32.713 回答
0

我相信这是固定的,将在 0.9.1 版本中

于 2012-11-14T00:11:06.590 回答