如何在Chartkick中剥离日期仅保留时间,实现24小时横轴叠加时序数据?
解决Chartkick折线图叠加两天24小时数据的问题
要把不同日期的两条时序曲线叠加到24小时横轴上,核心是剥离datetime字段的日期部分,只保留时间信息,让两条数据的横轴标签一致。具体修改如下:
方法1:将datetime格式化为时间字符串(如"00:00")
修改数据处理逻辑,用Ruby的strftime方法把完整datetime转换为仅包含小时和分钟的字符串,替换原有的datetime对象:
<% the_date_time_span = the_date..the_date + 23.hour %> <% other_date_time_span = other_date..other_date + 23.hour %> <%= line_chart [ {name: "One day", data: HourByHour.where(datetime: other_date_time_span).pluck(:datetime, :enphase).map { |dt, val| [dt.strftime("%H:%M"), val] }}, {name: "Another day", data: HourByHour.where(datetime: the_date_time_span).pluck(:datetime, :enphase).map { |dt, val| [dt.strftime("%H:%M"), val] }} ] %>
如果需要基于UTC时间显示,把dt.strftime改成dt.utc.strftime("%H:%M")即可。
方法2:直接使用小时数值(如0-23)
如果不需要显示具体时间格式,也可以用datetime的小时数值作为横轴标签,代码更简洁:
<%= line_chart [ {name: "One day", data: Hour.where(datetime: other_date_time_span).pluck(:datetime, :enphase).map { |dt, val| [dt.hour, val] }}, {name: "Another day", data: Hour.where(datetime: the_date_time_span).pluck(:datetime, :enphase).map { |dt, val| [dt.hour, val] }} ] %>
注意事项
- 确保两天的数据集每个小时都有对应记录,否则Chartkick会自动处理缺失点(比如留空或插值);
- 若存在时区差异,需统一转换为同一时区的时间后再处理,避免横轴错位。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

