如何将datetime中的时间转换为字符串/数值以用于颜色映射
解决散点图按datetime时间着色的问题
你遇到的核心问题是:plt.scatter()的c参数仅支持数值类型,而datetime.time是对象类型,所以会抛出类型错误。解决思路是把时间转换成一天内的小时数(带小数,比如14:15就是14.25),用这个数值作为颜色映射的依据。
两种可行的转换方法
方法一:直接提取时分秒计算小时数
通过dt属性分别提取时、分、秒,转换成总小时数:
# 计算一天中的精确小时数(包含分钟、秒的小数部分) hour_of_day = above_aligned["timestamp"].dt.hour + above_aligned["timestamp"].dt.minute/60 + above_aligned["timestamp"].dt.second/3600 x = dfbelow[1:].wind_speed.values y = above_aligned["WS"].values plt.scatter(x, y, s=20, c=hour_of_day, cmap='YlOrBr') plt.xlabel("Below Canopy Wind Speed (m/s)") plt.ylabel("Above Canopy Wind Speed (m/s)") plt.title("Above vs. Below Canopy Wind Speeds (m/s)") plt.colorbar(label="Time of Day (Hours since 00:00)") plt.show() # 注意这里要加括号,否则不会显示图像
方法二:通过总秒数转换小时数
利用时间对象的总秒数,再转换为小时:
# 将时间转换为一天内的总秒数,再除以3600得到小时数 hour_of_day = above_aligned["timestamp"].dt.time.apply(lambda t: t.hour*3600 + t.minute*60 + t.second) / 3600 # 绘图代码与方法一一致 x = dfbelow[1:].wind_speed.values y = above_aligned["WS"].values plt.scatter(x, y, s=20, c=hour_of_day, cmap='YlOrBr') plt.xlabel("Below Canopy Wind Speed (m/s)") plt.ylabel("Above Canopy Wind Speed (m/s)") plt.title("Above vs. Below Canopy Wind Speeds (m/s)") plt.colorbar(label="Time of Day (Hours since 00:00)") plt.show()
额外注意点
- 原代码中
plt.show缺少括号,必须写成plt.show()才会渲染并显示图像。 - 颜色条的标签可以根据需求调整,比如改成"Time (HH:MM)",但因为我们用的是小时数值,显示小时数更直观。
内容的提问来源于stack exchange,提问作者Alyssa S
相关产品推荐
相关产品推荐

