如何使用BigQuery获取任何城市的历史天气?

Fel*_*ffa 11 sql weather opendata google-bigquery

BigQuery将NOAA的gsod数据作为公共数据集加载 - 从1929年开始:https://www.reddit.com/r/bigquery/comments/2ts9wo/noaa_gsod_weather_data_loaded_into_bigquery/

如何检索任何城市的历史数据?

Fel*_*ffa 13

2017年更新:标准SQL和最新表:

SELECT * 
FROM `fh-bigquery.weather_gsod.all`
WHERE name='SAN FRANCISCO INTERNATIONAL A'
ORDER BY date DESC
Run Code Online (Sandbox Code Playgroud)

另外一个例子,展示这十年来芝加哥最寒冷的日子:

SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `fh-bigquery.weather_gsod.all` 
WHERE name LIKE 'SAN FRANC%'
AND date > '1980-01-01'
GROUP BY 1,2
ORDER BY active_until DESC
Run Code Online (Sandbox Code Playgroud)

要检索任何城市的历史天气,首先我们需要找到该城市的哪些电台报告.该表[fh-bigquery:weather_gsod.stations]包含已知电台的名称,其状态(如果在美国),国家/地区和其他详细信息.

因此,要查找德克萨斯州奥斯汀的所有电台,我们将使用如下查询:

WITH city AS (SELECT ST_GEOGPOINT(-122.465, 37.807))

SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) station_until
FROM `fh-bigquery.weather_gsod.all_geoclustered`  
WHERE EXTRACT(YEAR FROM date) > 1980
AND ST_DISTANCE(point_gis, (SELECT * FROM city)) < 40000
GROUP BY name, state
HAVING EXTRACT(YEAR FROM station_until)>2018
ORDER BY ST_DISTANCE(ANY_VALUE(point_gis), (SELECT * FROM city)) 
LIMIT 5
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这种方法有两个问题需要解决:

  • 并非每个已知的工作站都存在于该表中 - 我需要获取此文件的更新版本.所以如果你找不到你想要的电台,不要放弃.
  • 并非每个工作站中的每个工作站都在运行 - 所以我们需要在我们寻找的那一年找到有数据的工作站.

要解决第二个问题,我们需要将站表与我们正在寻找的实际数据相连接.以下查询查找奥斯汀周围的站点,该列c查看2015年期间有多少天具有实际数据:

SELECT TIMESTAMP(CONCAT(year,'-',mo,'-',da)) day, AVG(min) min, AVG(max) max, AVG(IF(prcp=99.99,0,prcp)) prcp
FROM `bigquery-public-data.noaa_gsod.gsod2016`
WHERE stn='722540' AND wban='13904'
GROUP BY 1
ORDER BY day
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

非常好!我们在2015年找到4个站点,提供Austin的数据.

请注意,我们必须以一种特殊的方式对待"下雨":当一个站点不监视下雨时null,它会将其标记为99.99.我们的查询会过滤掉这些值.

现在我们知道了这些站的stn和wban数字,我们可以选择其中任何一个并可视化结果:

#standardSQL
SELECT year, FORMAT('%s%s',mo,da) day ,min
FROM `fh-bigquery.weather_gsod.stations` a
JOIN `bigquery-public-data.noaa_gsod.gsod201*` b
ON a.usaf=b.stn AND a.wban=b.wban
WHERE name='CHICAGO/O HARE ARPT'
AND min!=9999.9
AND mo<'03'
ORDER BY 1,2
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述