如何将Timestamp转为字符串以命名并保存Matplotlib绘图文件?
解决Timestamp与字符串拼接的TypeError问题
这个报错的原因很直接:你没法直接把Timestamp对象和字符串'.png'做加法运算。groupby('index_hour')返回的hour是pandas.Timestamp类型,必须先把它转换成符合文件名规范的字符串,才能和后缀拼接。
下面给你几种实用的解决方法:
方法1:用strftime()自定义格式化文件名
strftime()是Timestamp的专属格式化方法,能把时间转成你想要的任意字符串格式,还能避开系统不允许的特殊字符(比如冒号:):
for hour, group in df.groupby('index_hour'): # 格式化为"YYYY-MM-DD_HH"的字符串,避免冒号导致的系统兼容性问题 filename = hour.strftime("%Y-%m-%d_%H") + '.png' plt.savefig(filename, dpi=300, bbox_inches='tight') plt.close() # 记得关闭画布,防止内存泄漏
这样生成的文件名会是2019-01-25_17.png这类格式,既清晰又不会触发系统文件名限制。
方法2:转字符串后替换特殊字符
如果你想保留完整的时间戳信息,可以先把Timestamp转成字符串,再替换掉冒号:
for hour, group in df.groupby('index_hour'): # 把时间戳转成字符串后,用下划线替换冒号 hour_str = str(hour).replace(':', '_') filename = f"{hour_str}.png" plt.savefig(filename, dpi=300, bbox_inches='tight') plt.close()
这种方式会生成类似2019-01-25_17_00_00.png的文件名,能完整保留时间戳细节。
方法3:提前处理分组键为字符串
如果不想在循环里处理时间格式,可以提前把分组字段转成字符串格式:
# 先将索引的小时部分格式化为字符串类型的分组键 df['index_hour_str'] = df.index.strftime("%Y-%m-%d_%H") # 直接用字符串分组键循环,省去格式转换步骤 for hour_str, group in df.groupby('index_hour_str'): filename = f"{hour_str}.png" plt.savefig(filename, dpi=300, bbox_inches='tight') plt.close()
最后提醒一句:循环绘图后一定要用plt.close()关闭每个画布,否则大量未关闭的画布会占用内存,导致程序运行变慢甚至崩溃。
内容的提问来源于stack exchange,提问作者Zee
相关产品推荐
相关产品推荐

