Skip to main content
 首页 » 编程设计

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

2025年05月04日9sky-heaven

假设我有以下 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 

我的目标是提取最后一列'file'中某个数字第一次出现的行,所以得到一个类似这样的表:

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

我的方法是按"file"进行分组,然后在“第一个”上聚合:

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

但是这样做的问题是索引没有被用作分组的列。我通过首先将索引添加为列解决了这个问题:

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

但现在的问题是日期时间列不再是日期而是 float 的:

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

有没有

  • 一种将 float 转换回日期时间的方法?
  • 或者在 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"]) 

请您参考如下方法:

我认为这是 pandas 中的一个错误 - dtype 在 groupby 之后更改为 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 上创建了一个新问题