Skip to content

Instantly share code, notes, and snippets.

@edigiacomo
Last active August 29, 2015 14:26
Show Gist options
  • Select an option

  • Save edigiacomo/465128c9f50f8d581e01 to your computer and use it in GitHub Desktop.

Select an option

Save edigiacomo/465128c9f50f8d581e01 to your computer and use it in GitHub Desktop.
JSON generic report for Python DB-All.e
#!/usr/bin/env python
import dballe
from itertools import groupby
import sys
def do_report(db, station, date, records):
"""Create a report from a list of records of the same station,date."""
keyfoo = lambda r: (
r.get("timerange"), r.get("level")
)
data = sorted([r.copy() for r in records], key=keyfoo)
yield {
"ident": station.get("ident"),
"lon": station.key("lon").enqi(),
"lat": station.key("lat").enqi(),
"network": station.get("rep_memo"),
"date": date.isoformat() + "Z",
"data": [{
"vars": {
v: {
"v": station.get(v)
} for v in ["B07030", "B07031", "B01019"]
}
}] + [{
"timerange": k[0],
"level": k[1],
"vars": {
v["var"]: {
"v": v[v["var"]],
"a": {
i.code: i.get() for i in db.query_attrs(v.var().code, v["context_id"]).vars()
},
} for v in grp
}
} for k, grp in groupby(data, key=keyfoo)]
}
def do_reports(db, query):
"""Iterate over the reports."""
keyfoo = lambda r: (
r.get("ident"),
r.key("lon").enqi(), r.key("lat").enqi(),
r.get("rep_memo"), r.get("date"),
)
data = sorted([r.copy() for r in db.query_data(query)], key=keyfoo)
for key, grp in groupby(data, key=keyfoo):
s = db.query_stations(
dballe.Record(ident=key[0], lon=key[1], lat=key[2], rep_memo=key[3])
).next()
for r in do_report(db, s, key[4], grp):
yield r
if __name__ == '__main__':
from argparse import ArgumentParser
import json
parser = ArgumentParser(description="List of generic reports in JSON format")
parser.add_argument("dsn", help="DB-All.e DSN")
parser.add_argument("outfile", help="JSON output file")
args = parser.parse_args()
db = dballe.DB.connect_from_url(args.dsn)
q = dballe.Record()
with open(args.outfile, "w") as out:
json.dump(list(do_reports(db, q)), out, indent=4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment