如何将Pandas DataFrame日期列转为数值以绘制折线图?
解决Pandas DataFrame日期列转数值型的问题
嘿,我看你在把DataFrame里的日期列转成数值型、用来绘制折线图的时候遇到了问题,咱们先捋捋你代码里的问题在哪,再给你几个实用的解决办法:
你的代码问题分析
你这段代码的核心问题出在循环逻辑上:当你遍历Datum列的每一个日期字符串时,每次都会覆盖year、month这些变量的值,最后执行赋值语句的时候,只把最后一个日期转换后的数值赋值给了整个floatdate列,导致所有行的floatdate都是同一个值,这肯定不是你想要的结果呀。
方法一:用Pandas内置函数(推荐,高效又省心)
Pandas处理日期时间的工具非常强大,完全不用手动循环解析每一个字符串,几步就能搞定:
import pandas as pd import matplotlib.dates as mdates # 第一步:把字符串格式的日期转成Pandas原生的datetime类型 arsenalchelsea['datetime'] = pd.to_datetime(arsenalchelsea['Datum']) # 第二步:用matplotlib的date2num把datetime转成数值型日期 arsenalchelsea['floatdate'] = mdates.date2num(arsenalchelsea['datetime'])
这种方法不仅代码简洁,处理大数据量时的效率也比循环高得多,绝对是首选方案。
方法二:修正你的循环逻辑(符合你的初始思路)
如果你坚持想用循环的方式实现,那得把每一次转换的结果存起来,最后再统一赋值给新列:
import matplotlib.dates as mdates import datetime # 先创建一个空列表,用来存每一行转换后的数值 float_dates = [] for x in arsenalchelsea['Datum']: year = int(x[:4]) month = int(x[5:7]) day = int(x[8:10]) hour = int(x[11:13]) minute = int(x[14:16]) sec = int(x[17:19]) # 把当前行的转换结果添加到列表里 float_dates.append(mdates.date2num(datetime.datetime(year, month, day, hour, minute, sec))) # 把列表赋值给新列 arsenalchelsea['floatdate'] = float_dates
绘制折线图的小提示
有了数值型的floatdate列之后,你可以直接用它作为x轴绘制折线图,还能把x轴标签转回日期格式,方便阅读:
import matplotlib.pyplot as plt # 绘制折线图,替换成你要展示的数值列 plt.plot(arsenalchelsea['floatdate'], arsenalchelsea['target_column']) # 设置x轴日期显示格式 plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M')) # 旋转x轴标签,避免重叠 plt.xticks(rotation=45) plt.show()
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

