Files
test/metararchive.py
2025-11-29 10:08:32 +00:00

91 lines
2.8 KiB
Python

import requests
import json
from datetime import datetime, timezone
import re
import psycopg2
import psycopg2.extensions
import time
metarlist = ['KCRW','KHTS','KBKW','KEKN','KPKB','KCKB','KBLF','K6L4','K48I','KHLG','KI16','KLWB','KMGW','KMRB','KW22','KW99','KUNI','KJRO','KPMH','KDWU','KZZV','KLNP','KJKL','KPBX','KSYM','KFGX','KJKL','KLHQ','KRZT','KCMH']
S = requests.Session()
conn = psycopg2.connect(host='localhost', database='nws', user='nws', password='nws')
cursor = conn.cursor()
#https://aviationweather.gov/api/data/metar?ids=KCRW%2CKHTS%2CKPKB&format=json&taf=false&hours=5
fetcharray = []
def createurl(metarslist):
baseurl = 'https://aviationweather.gov/api/data/metar?ids='
for i, metar in enumerate(metarlist):
if i == len(metarlist) - 1:
baseurl = baseurl + metar
else:
baseurl = baseurl + metar + "%2C"
baseurl = baseurl + "&format=json&taf=false&hours=2"
fetcharray.append(baseurl)
def backfillmetars(metarlist):
for i in metarlist:
baseurl = 'https://aviationweather.gov/api/data/metar?ids='
baseurl = baseurl + i + "&format=json&taf=false&hours=120"
fetcharray.append(baseurl)
#print(baseurl)
#backfillmetars(['KCRW'])
createurl(metarlist)
for k in fetcharray:
content = S.get(k)
metardict = content.json()
#print(metardict)
for i in metardict:
obid = i.get('metar_id')
# Generate a unique obid if it's None
if obid is None:
# Use a combination of icaoId and reportTime to generate a unique identifier
icao = i.get('icaoId')
obtime = i.get('reportTime')
if icao is not None and obtime is not None:
obid = f"{icao}_{obtime}"
else:
# If both are None, we can't generate a reliable ID, so skip this record
print(f"Skipping record due to missing icaoId or reportTime: {i}")
continue
else:
icao = i.get('icaoId')
obtime = i.get('reportTime')
temp = i.get('temp')
dewp = i.get('dewp')
visib = i.get('visib')
wx = i.get('wxString')
precip1 = i.get('precip')
precip3 = i.get('precip3hr')
precip6 = i.get('precip6hr')
lat = i.get('lat')
lon = i.get('lon')
raw = i.get('rawOb')
stationname = i.get('name')
params = (obid, icao, obtime, temp, dewp, visib, wx, precip1, precip3, precip6, lat, lon, raw, stationname)
sql = "INSERT INTO metars (obid, icao, obtime, temp, dewp, visib, wx, precip1, precip3, precip6, lat, lon, raw, stationname) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) on conflict do nothing"
cursor.execute(sql,params)
conn.commit()
conn.close()