问题将字符串转换为日期vega lite

时间:2020-03-24 19:05:05

标签: vega-lite

我是Vega-Lite的新手,我试图在折线图中显示一些数据,但是我相信“ Harvest_Year”数据(该日期是前几年的日期:2017、2018)正在显示为字符串。

我是从.csv文件中通过数据导入的,以下是将字符串更改为日期格式的步骤。我很累:

"Harvest_Year": "year"

但是那没有用,因为它使我所有的值都为空。所以我想首先将其转换为整数,然后将其转换为年份。但是在Vega-Lite中,我的所有年份都正确地显示在表格中,但是当我在折线图上显示它时,我只能看到1970(我确定我没有在数据集中),并且只显示该年份。

line graph displaying only one year

在下面的图像中,您可以看到我的数据中包含所有年份:

correct data

{
  "$schema": "https://vega.github.io/schema/vega-lite/v4.json",
  "data": {
    "url": "https://raw.githubusercontent.com/DanStein91/Info-vis/master/CoffeeRobN.csv",
    "format": {
      "type": "csv",
            "parse": {
       "Number_of_Bags": "number",
        "Bag_weight": "number",
        "Harvest_Year": "number"
      }
    }
  },
  "transform": [
{
    "timeUnit": "year",
    "field": "Harvest_Year",
    "as": "Year"
  },
     {
      "calculate": "datum.Number_of_Bags * datum.Bag_Weight ",
      "as": "Total_Export"
    }
  ],  
      "width": 300,
      "height": 200,
  "mark": "line",
  "encoding": {

    "y": {
      "field": "Total_Export",
      "type": "quantitative"
    },
    "x": {
      "field": "Harvest_Year",
      "type": "temporal"
    }
  },
  "config": {}
}

欢迎任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

当您告诉vega-lite将数字解释为日期时,它会将它们视为unix时间戳,即1970年1月1日之后的毫秒数。您得到的每个日期都在1970年,这将导致您看到图表。 / p>

您的日期似乎采用非标准格式(例如"2017.0"表示2017年),因此您必须使用vega expressions手动将其解析为日期对象。这是一个示例(view in editor):

{
  "data": {
    "url": "https://raw.githubusercontent.com/DanStein91/Info-vis/master/CoffeeRobN.csv",
    "format": {
      "type": "csv",
      "parse": {
        "Number_of_Bags": "number",
        "Bag_weight": "number",
        "Harvest_Year": "number"
      }
    }
  },
  "transform": [
    {"filter": "isValid(datum.Harvest_Year)"},
    {"calculate": "datetime(datum.Harvest_Year, 1)", "as": "Harvest_Year"},
    {
      "calculate": "datum.Number_of_Bags * datum.Bag_Weight ",
      "as": "Total_Export"
    }
  ],
  "mark": "point",
  "encoding": {
    "y": {"field": "Total_Export", "type": "quantitative"},
    "x": {"field": "Harvest_Year", "type": "ordinal", "timeUnit": "year"}
  },
  "width": 300,
  "height": 200
}

enter image description here

另一种选择是完全避免使用datetimetimeUnit逻辑(因为您的数据实际上不包含任何日期),而直接在编码中使用年份数字即可;例如

{
  "data": {
    "url": "https://raw.githubusercontent.com/DanStein91/Info-vis/master/CoffeeRobN.csv",
    "format": {
      "type": "csv",
      "parse": {
        "Number_of_Bags": "number",
        "Bag_weight": "number",
        "Harvest_Year": "number"
      }
    }
  },
  "transform": [
    {"filter": "isValid(datum.Harvest_Year)"},
    {
      "calculate": "datum.Number_of_Bags * datum.Bag_Weight ",
      "as": "Total_Export"
    }
  ],
  "mark": "point",
  "encoding": {
    "y": {"field": "Total_Export", "type": "quantitative"},
    "x": {"field": "Harvest_Year", "type": "ordinal"}
  },
  "width": 300,
  "height": 200
}