X轴上具有日期时间段(月年)的散景图

时间:2018-11-04 03:23:21

标签: time-series bokeh python-datetime

我是bokeh /熊猫的新手,并试图通过使用x月轴的月年和y轴的整数来绘制趋势线。

我的数据如下:

year_month  emp_count
0   2015-09     1450425
1   2015-10     3093811
2   2015-11     3316241
3   2015-12     3308658
4   2016-01     3402191

要使用bokeh进行绘图,我将两列都转换为ndarray。当我将year-month列转换为ndarray时,它将每个值显示为Period。我已经使用了to_period('M')方法来使year_month脱离日期列。

    temp_df.year_month.values
>>output
    array([Period('2015-09', 'M'), Period('2015-10', 'M'),
           Period('2015-11', 'M'), Period('2015-12', 'M'),
           Period('2016-01', 'M'), Period('2016-02', 'M'),

所以当我使用这些数据进行绘图时,出现以下错误:

  

TypeError:“ Period”类型的对象不可JSON序列化

为避免此错误,我将year_month列类型转换为字符串,但是我仍然遇到相同的错误。我完整的代码如下:

temp_df.year_month = temp_df.year_month.astype(str)
output_file('trend1.html')
p = figure(title='Employee trend', 
           plot_width=800, 
           plot_height=350,
           x_axis_label='Month-Year', y_axis_label='No of Employees', 
          x_axis_type='datetime')

p.line(x= temp_df.year_month, 
       y = temp_df.emp_count)

show(p)

有人知道如何使用bokeh在x轴上绘制年月吗?

2 个答案:

答案 0 :(得分:0)

我想我找到了问题。您应该将列转换为日期时间。

df['year_month']=pd.to_datetime(df['year_month'])

这应将您的列值更改为以下值(天默认为01):

   year_month      emp_count
0   2015-09-01     1450425
1   2015-10-01     3093811
2   2015-11-01     3316241
3   2015-12-01     3308658
4   2016-01-01     3402191

然后情节将起作用。我在一个虚拟值上对其进行了测试,如下所示。

Value   month_year
2   2018-11-01
3   2018-01-01
4   2018-02-01
5   2018-05-01


sample=pd.DataFrame(pd.read_csv('sample.csv'))
sample['month_year']=pd.to_datetime(sample['month_year'])
p = figure(title='Employee trend', 
           plot_width=800, 
           plot_height=350,
           x_axis_label='Month-Year', y_axis_label='No of Employees', 
          x_axis_type='datetime')

p.scatter(x= sample.month_year, 
       y = sample.Value)

show(p)

Output

让我知道是否可行。 谢谢

答案 1 :(得分:0)

我已经通过另一种方法解决了这个问题。感谢@Samira的启发。

我从日期对象中提取了年月,默认日期为'1'。

    df = df.join(df.as_of_date.apply(lambda x : pd.Series({
    'day': x.day, 
    'year':x.year, 
    'month': x.month, 
    'year_month': x.to_period('M'),
    'year_month_01': pd.datetime(x.year,x.month,1)
})))

之后,在轴上使用了“ year_month_01”,散景图看起来像预期的那样。

bokeh graph