使用K-Means对COVID CSV聚类时遇ValueError错误求助
解决K-Means聚类中日期字符串无法转为浮点型的错误
错误原因
K-Means是纯数值计算的聚类算法,不能直接处理字符串类型的数据。你代码里的Date列是'1/1/2020'这种字符串格式,哪怕改成dd/mm/yyyy格式,本质还是字符串,算法无法将其转为浮点型参与计算,所以触发了这个错误。
解决方案
把日期字符串转为数值型特征,比如日期对应的时间戳、从起始日期开始的天数,或者提取年份/月份的数值,再用这些数值和COVID-19 Death一起作为聚类特征。
修改后的完整代码
import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 读取数据 df = pd.read_csv('Monthly_COVID.csv') # 1. 将日期字符串转为pandas datetime类型 # 如果CSV日期格式是月/日/年,指定format确保解析正确 df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y') # 2. 生成数值型日期特征:比如从第一个日期开始的天数 df['Days_Since_Start'] = (df['Date'] - df['Date'].min()).dt.days # 3. 选择数值型特征进行聚类 features = df[['Days_Since_Start', 'COVID-19 Death']] # 4. 执行K-Means聚类 kmeans = KMeans(n_clusters=3, random_state=42) df['Cluster'] = kmeans.fit_predict(features) print(df.head()) # 5. 可视化:用原始日期作为横轴,保持可读性 plt.figure(figsize=(10, 6)) plt.scatter(df['Date'], df['COVID-19 Death'], c=df['Cluster'], cmap='viridis') plt.xlabel('Date') plt.ylabel('COVID-19 Death') plt.title('K-means Clustering of Monthly COVID Data') # 旋转日期标签避免重叠 plt.xticks(rotation=45) plt.show()
关键说明
pd.to_datetime:把字符串日期转为datetime对象,后续可以方便提取数值特征。如果你的CSV日期格式不是%m/%d/%Y(比如是日/月/年),需要修改format参数为%d/%m/%Y。Days_Since_Start:将日期转化为从数据集中最早日期开始的天数,是连续的数值,适合聚类计算。你也可以用时间戳(df['Date'].astype('int64') // 10**9,转为秒级时间戳)替代,效果类似。- 聚类时只传入数值型特征:确保
features里的列都是数值类型,避免字符串干扰。
内容的提问来源于stack exchange,提问作者Jay Hong
相关产品推荐
相关产品推荐

