https://github.com/antarctica/pymetdecoder

Python module for decoding Met reports (e.g. SYNOP)

https://github.com/antarctica/pymetdecoder

Science Score: 23.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
  • DOI references
  • Academic publication links
  • Committers with academic emails
    1 of 1 committers (100.0%) from academic institutions
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (5.2%) to scientific vocabulary
Last synced: 11 months ago · JSON representation

Repository

Python module for decoding Met reports (e.g. SYNOP)

Basic Info
  • Host: GitHub
  • Owner: antarctica
  • License: other
  • Language: Python
  • Default Branch: master
  • Size: 168 KB
Statistics
  • Stars: 21
  • Watchers: 5
  • Forks: 11
  • Open Issues: 0
  • Releases: 4
Created about 5 years ago · Last pushed over 1 year ago
Metadata Files
Readme Changelog License

README.md

README

This is a Python module which decodes meteorological reports (e.g. SYNOPs) into a Python dictionary. It can also take a Python dictionary and encode a meteorological report from it.

Currently supported

The current version of the module supports the following (in most cases; see Known Issues below):

  • SYNOP (FM-12)
  • SHIP (FM-13)
  • SYNOP MOBIL (FM-14)

Example usage

To decode a SYNOP:

```python from pymetdecoder import synop as s

synop = "AAXX 01004 88889 12782 61506 10094 20047 30111 40197 53007 60001 81541 333 81656 86070" output = s.SYNOP().decode(synop) print(output) ```

This yields the following output (pretty-printed):

json { "station_type": { "value": "AAXX" }, "obs_time": { "day": { "value": 1 }, "hour": { "value": 0 } }, "wind_indicator": { "value": 4, "unit": "KT", "estimated": false }, "station_id": { "value": "88889" }, "region": { "value": "III" }, "precipitation_indicator": { "value": 1, "in_group_1": true, "in_group_3": false }, "weather_indicator": { "value": 2, "automatic": false }, "lowest_cloud_base": { "_table": "1600", "min": 1500, "max": 2000, "quantifier": null, "_code": 7, "unit": "m" }, "visibility": { "_table": "4377", "value": 40000, "quantifier": null, "use90": false, "_code": 82, "unit": "m" }, "cloud_cover": { "_table": "2700", "value": 6, "obscured": false, "unit": "okta", "_code": 6 }, "surface_wind": { "direction": { "_table": "0877", "value": 150, "varAllUnknown": false, "calm": false, "_code": 15, "unit": "deg" }, "speed": { "value": 6, "unit": "KT" } }, "air_temperature": { "value": 9.4, "unit": "Cel" }, "dewpoint_temperature": { "value": 4.7, "unit": "Cel" }, "station_pressure": { "value": 1011.1, "unit": "hPa" }, "sea_level_pressure": { "value": 1019.7, "unit": "hPa" }, "pressure_tendency": { "tendency": { "_table": "0200", "value": 3 }, "change": { "value": 0.7, "unit": "hPa" } }, "precipitation_s1": { "amount": { "_table": "3590", "value": 0, "quantifier": null, "trace": false, "_code": 0, "unit": "mm" }, "time_before_obs": { "_table": "4019", "value": 6, "unit": "h", "_code": 1 } }, "cloud_types": { "low_cloud_type": { "_table": "0513", "value": 5 }, "middle_cloud_type": { "_table": "0515", "value": 4 }, "high_cloud_type": { "_table": "0509", "value": 1 }, "low_cloud_amount": { "value": 1, "unit": "okta" } }, "cloud_layer": [ { "cloud_cover": { "_table": "2700", "value": 1, "obscured": false, "unit": "okta", "_code": 1 }, "cloud_genus": { "_table": "0500", "value": "Sc", "_code": 6 }, "cloud_height": { "_table": "1677", "value": 1800, "quantifier": null, "_code": 56, "unit": "m" } }, { "cloud_cover": { "_table": "2700", "value": 6, "obscured": false, "unit": "okta", "_code": 6 }, "cloud_genus": { "_table": "0500", "value": "Ci", "_code": 0 }, "cloud_height": { "_table": "1677", "value": 6000, "quantifier": null, "_code": 70, "unit": "m" } } ] }

Re-encoding this dict gets back the original SYNOP:

```python from pymetdecoder import synop as s

original = "AAXX 01004 88889 12782 61506 10094 20047 30111 40197 53007 60001 81541 333 81656 86070" synop = s.SYNOP() output = synop.decode(synop) msg = synop.encode(output)

print(msg)

Returns AAXX 01004 88889 12782 61506 10094 20047 30111 40197 53007 60001 81541 333 81656 86070

```

Commonly seen attributes in the output dict are as follows:

  • value - The absolute value of the attribute
  • min, max - If a code value converts to a range, the min/max specifies the limit of the range
  • quantifier - Used alongside min/max/value to add an inequality if needs be (e.g. { "value": 6000, "quantifier": "isGreater"} represents a value >6000). This is often the case when looking up values in a code table
  • unit - The unit the value is measured in. The Unified Code for Units of Measure is used here (https://ucum.org/ucum.html)
  • _table - This is the code table used to look up the value
  • _code - The code value looked up in the code table. When encoding a message, if this attribute is present, it will use that, rather than trying to calculate it from the value

Malformed reports

The module will try to decode as much of a report as it can. Non-fatal problems (e.g. invalid codes) will emit a warning message and continue. Fatal problems will emit a DecodeError exception, which can be caught in a try...except block.

Changelog

See CHANGELOG.md for the list of changes

Known issues

This version is 0.1.6. There may be some uncaught bugs/issues or other problems that have not been found yet. The following is a list of known issues which are still to be addressed:

  • Not all countries are auto-detected. As more region-specific handling is added, more countries will be added to the list
  • Section 5 of the SYNOP messages are not handled yet. Any codes in these sections are stored in the output dict under the section5 attribute
  • Most of the group 9 codes of section 3 are handled. Any codes not handled are added to a list in the output dict under the _not_implemented attribute
  • Some aspects of encoding have not been fully tested

Feel free to raise any additional issues/bugs in the issue tracker

Future plans

In future, it is intended that the module will support the following:

  • SYNOP section 5
  • BUOY (FM-18)
  • TEMP (FM-35)
  • CLIMAT (FM-71)
  • METAR (FM-15)

If you would like to contribute to this module by adding in the functionality to support any of these reports (or other reports), then feel free to do so!

License

(c) UK Research and Innovation (UKRI), 2021 - 2024, British Antarctic Survey. You may use and re-use this software and associated documentation files free of charge in any format or medium, under the terms of the Open Government Licence v3.0. You may obtain a copy of the Open Government Licence at http://www.nationalarchives.gov.uk/doc/open-government-licence/

Owner

  • Name: British Antarctic Survey
  • Login: antarctica
  • Kind: organization
  • Email: info@bas.ac.uk
  • Location: Cambridge, UK

British Antarctic Survey (BAS) delivers world-leading interdisciplinary research in the Polar Regions

GitHub Events

Total
  • Issues event: 5
  • Watch event: 6
  • Issue comment event: 4
  • Push event: 4
  • Fork event: 1
  • Create event: 1
Last Year
  • Issues event: 5
  • Watch event: 6
  • Issue comment event: 4
  • Push event: 4
  • Fork event: 1
  • Create event: 1

Committers

Last synced: over 3 years ago

All Time
  • Total Commits: 43
  • Total Committers: 1
  • Avg Commits per committer: 43.0
  • Development Distribution Score (DDS): 0.0
Top Committers
Name Email Commits
Tim Barnes t****a@b****k 43
Committer Domains (Top 20 + Academic)

Issues and Pull Requests

Last synced: about 1 year ago

All Time
  • Total issues: 15
  • Total pull requests: 1
  • Average time to close issues: 5 months
  • Average time to close pull requests: about 20 hours
  • Total issue authors: 6
  • Total pull request authors: 1
  • Average comments per issue: 1.73
  • Average comments per pull request: 2.0
  • Merged pull requests: 1
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 1
  • Pull requests: 0
  • Average time to close issues: 1 day
  • Average time to close pull requests: N/A
  • Issue authors: 1
  • Pull request authors: 0
  • Average comments per issue: 2.0
  • Average comments per pull request: 0
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • RoryPTB (6)
  • khelfer (4)
  • aothompson (2)
  • tomas-kral (1)
  • Weidav (1)
  • vtoupet (1)
Pull Request Authors
  • khelfer (1)
Top Labels
Issue Labels
bug (7) enhancement (2)
Pull Request Labels

Packages

  • Total packages: 1
  • Total downloads:
    • pypi 302 last-month
  • Total docker downloads: 150
  • Total dependent packages: 2
  • Total dependent repositories: 1
  • Total versions: 7
  • Total maintainers: 1
pypi.org: pymetdecoder

Python module to decode/encode met reports e.g. SYNOPs

  • Versions: 7
  • Dependent Packages: 2
  • Dependent Repositories: 1
  • Downloads: 302 Last month
  • Docker Downloads: 150
Rankings
Docker downloads count: 2.7%
Dependent packages count: 10.1%
Forks count: 10.9%
Average: 12.7%
Downloads: 13.8%
Stargazers count: 17.1%
Dependent repos count: 21.6%
Maintainers (1)
Last synced: 11 months ago

Dependencies

setup.py pypi