假设我有以下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
有吗
示例数据框可以按如下方式使用:
复制(到剪贴板):
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"])
答案 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发布中