如何从YYYY-YY格式CSV列提取年份用于Pandas+Bokeh绘图
问题原因
你遇到的空白图表问题本质是pandas默认的日期解析逻辑无法识别YYYY-YY格式的财年字符串,读取后Year/Ports列仍为文本类型,无法匹配Bokeh图表的datetime类型X轴,因此无法渲染折线。
你不需要手动提取YYYY部分,有两种更合理的自动化处理方案:
方案1:转换为标准 datetime 类型(推荐,适配时间轴缩放、排序需求)
可以自定义财年转日期的逻辑,不需要修改原始CSV文件,处理代码如下:
首先新增财年解析函数,将YYYY-YY转换为标准日期(可根据实际业务规则选择财年起始/结束日期,以下示例默认采用印度财年规则,以每年4月1日作为财年起始点):
import pandas as pd from bokeh.plotting import figure,show from bokeh.io import output_file from bokeh.models import FuncTickFormatter def parse_fiscal_year(fy_str): # 提取财年起始年份 start_year = int(fy_str.split('-')[0]) # 可根据需求调整为财年结束日期,比如f"{start_year+1}-03-31" return pd.to_datetime(f"{start_year}-04-01") # 读取CSV后手动处理日期列 df = pd.read_csv("Cargo_Data_full.csv") df['Year/Ports'] = df['Year/Ports'].apply(parse_fiscal_year) output_file("Cargo tracker.html") f = figure(height=200,sizing_mode = 'scale_width',x_axis_type = 'datetime') f.title.text = "Cargo Tracker" f.xaxis.axis_label="Year/Ports" f.yaxis.axis_label="Cargo handled" # 自定义X轴刻度显示,将日期转换回原有的YYYY-YY格式 f.xaxis.formatter = FuncTickFormatter(code=""" const date = new Date(tick); const year = date.getFullYear(); return `${year}-${(year+1).toString().slice(-2)}`; """) f.line(df['Year/Ports'],df['OTHERS']) show(f)
该方案保留了时间轴的连续性,支持缩放、筛选等交互操作,同时X轴显示和原始数据一致的财年格式。
方案2:使用分类X轴(适合不需要时间间隔计算的固定序列场景)
如果不需要按时间间隔做计算或缩放,也可以直接把财年字符串设为有序分类,不需要转日期:
import pandas as pd from bokeh.plotting import figure,show from bokeh.io import output_file df = pd.read_csv("Cargo_Data_full.csv") # 将财年列设为有序分类,保证顺序和原始CSV一致 df['Year/Ports'] = pd.Categorical(df['Year/Ports'], ordered=True) output_file("Cargo tracker.html") # 不需要指定x_axis_type为datetime,通过x_range指定分类顺序 f = figure(height=200,sizing_mode = 'scale_width', x_range=df['Year/Ports']) f.title.text = "Cargo Tracker" f.xaxis.axis_label="Year/Ports" f.yaxis.axis_label="Cargo handled" f.line(df['Year/Ports'],df['OTHERS']) show(f)
内容的提问来源于stack exchange,提问作者Harshad Karekar
相关产品推荐
相关产品推荐

