我有一个看起来像这样的pandas DataFrame:
pta ptd dep_at4 2020-01-08 05:17:00 NaT NaT6 2020-01-08 05:29:00 2020-01-08 05:30:00 NaT9 2020-01-08 05:42:00 2020-01-08 05:44:00 2020-01-08 05:44:0011 2020-01-08 05:53:00 2020-01-08 05:54:00 2020-01-08 05:55:0012 2020-01-08 06:03:00 2020-01-08 06:05:00 2020-01-08 06:04:00
以及数据类型:
pta datetime64[ns]ptd datetime64[ns]dep_at datetime64[ns]dtype: object
我使用这些数据来预测另一列arr_at
,它也是datetime64[ns]
类型。运行以下代码一切正常:
X = df[['pta','ptd','dep_at']]y = df.arr_atX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% 用于训练,30% 用于测试knn = KNeighborsClassifier(n_neighbors=5)knn.fit(X_train, y_train)y_pred = knn.predict(X_test)print("准确率:",metrics.accuracy_score(y_test, y_pred))
我试图添加另一个特征列,因此我的输入现在看起来像这样:
pta ptd dep_at tpl_num4 2020-01-08 05:17:00 NaT NaT 06 2020-01-08 05:29:00 2020-01-08 05:30:00 NaT 19 2020-01-08 05:42:00 2020-01-08 05:44:00 2020-01-08 05:44:00 211 2020-01-08 05:53:00 2020-01-08 05:54:00 2020-01-08 05:55:00 312 2020-01-08 06:03:00 2020-01-08 06:05:00 2020-01-08 06:04:00 4
(以及数据类型):
pta datetime64[ns]ptd datetime64[ns]dep_at datetime64[ns]tpl_num int64dtype: object
但是现在,当我运行与之前相同的KNN代码,仅更改
X = df[['pta','ptd','dep_at']]
为
X = df[['pta','ptd','dep_at','tpl_num']]
我得到以下错误:
TypeError: float()参数必须是字符串或数字,而不能是'Timestamp'
我无法弄清楚哪里出了问题。需要注意的是,我通过以下方式将列添加到特征数据中,尽管我相当确定这不会影响任何事情:
# 将csv中的站点名称映射为整数,使用字典推导式tpl_class = {k: v for v, k in enumerate(df.tpl.unique())}# 应用到数据df['tpl_num'] = [tpl_class[i] for i in df.tpl]
回答:
我认为这是因为你现在在knn中混合了不同类型的数据。
一个解决方法是将你的datetime[ns]转换为整数(例如,对于一列):
df['pta'] = pd.to_datetime(df['pta']).astype(np.int64)
在你选择X之前对所有日期时间列进行这样的转换,然后它应该能正常工作。