假设我有以下 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 上创建了一个新问题
关于python - 在 groupby 操作中保留日期时间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13361326/