You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用原生Vega-Lite函数将日期与小时转换为Datetime?

问题:如何在Vega-Lite中统一处理一位数和两位数小时的datetime转换?

给定如下格式的时序数据:

{"date": "2022-12-28", "hr": 10, "temp": 5.7}, 
{"date": "2022-12-28", "hr": 9, "temp": 5.0}, 
...

需要将date和hr字段合并为合法的datetime值。尝试过两种转换方式,但都存在局限性:

  • 第一种转换仅对两位数小时(10-23)有效,一位数小时会被忽略:
    {"calculate": "time(datum.date + 'T' + datum.hr + ':00:00')", "as": "t"}
    
  • 第二种转换仅对一位数小时有效,两位数小时会失效:
    {"calculate": "time(datum.date + 'T0' + datum.hr + ':00:00')", "as": "t"}
    

解决方案

使用Vega-Lite原生的format函数,通过格式化字符串对小时数进行补零处理,确保无论一位数还是两位数小时都能生成符合ISO标准的时间字符串。

正确的转换表达式为:

{"calculate": "time(datum.date + 'T' + format(datum.hr, '%02d') + ':00:00')", "as": "t"}

其中format(datum.hr, '%02d')会自动将小时数格式化为两位数字:一位数小时补前导零(如9转为"09",0转为"00"),两位数小时保持原样。拼接后的时间字符串始终合法,time函数可以正确解析所有情况。


修改后的完整Vega-Lite配置
{
        "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
        "description": "逐小时温度变化",
        "width": "container",
        "data": {"values": [
                  {"date": "2022-12-28", "hr": 10, "temp": 5.7}, 
                  {"date": "2022-12-28", "hr": 9, "temp": 5.0}, 
                  {"date": "2022-12-28", "hr": 8, "temp": 3.8}, 
                  {"date": "2022-12-28", "hr": 7, "temp": 3.1}, 
                  {"date": "2022-12-28", "hr": 6, "temp": 2.7}, 
                  {"date": "2022-12-28", "hr": 5, "temp": 2.1}, 
                  {"date": "2022-12-28", "hr": 4, "temp": 1.9}, 
                  {"date": "2022-12-28", "hr": 3, "temp": -1.2}, 
                  {"date": "2022-12-28", "hr": 2, "temp": 1.0}, 
                  {"date": "2022-12-28", "hr": 1, "temp": 1.2}, 
                  {"date": "2022-12-28", "hr": 0, "temp": 1.5}, 
                  {"date": "2022-12-27", "hr": 23, "temp": 2.2}, 
                  {"date": "2022-12-27", "hr": 22, "temp": 2.5}
        ]},
        "transform": [
          {"calculate": "time(datum.date + 'T' + format(datum.hr, '%02d') + ':00:00')", "as": "t"}
        ],
        "encoding": {
          "x": {"field": "t", "type": "temporal", "title": "时间"},
          "y": {"type": "quantitative", "axis": {"title": "温度[°C]"}}
        },
        "layer": [
          {"mark": {"type": "circle", "opacity": 0.75, "tooltip": true},
           "encoding": {
             "y": {"field": "temp", "title": "温度"}, 
              "color": {"field": "temp", "type": "quantitative", 
                        "scale": {"domainMid": 0, "scheme": "viridis"}, "title": "[°C]"}
           }
          }
        ]
      }

内容的提问来源于stack exchange,提问作者Mruk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:25:39