Skip to content
Snippets Groups Projects
Owen Graham's avatar
Owen Graham authored
a24d2ee4
Name Last commit Last update
.gitignore
README.md
asccol.py
pyproject.toml
setup.cfg

asccol ASCII Columnar Data Parser

Use this simple library to parse aligned text data into Python named tuples, using your own specifications for keyword, type, and column width.

Example usage

import math
import sys
import asccol

def simple_time(s):
    """Convert a HHMM string to an (H, M) tuple."""
    hour = s[:2]
    minute = s[2:4]
    return tuple(map(int, (hour, minute)))

def filtered_float(s):
    """Like float, but ignore the special value 444.0."""
    val = float(s)
    return val if val != 444.0 else math.nan

# 10 minute data
# See https://amrc.ssec.wisc.edu/data/ftp/pub/aws/q10/q10readme.txt
Q10 = asccol.DataSpec(
    leading=2,  # lines to delete
    cols=(
        ('year', int, 4),  # keyword, type (converter function), width
        ('jdate', int, 4),
        ('month', int, 3),
        ('date', int, 3),
        ('time', simple_time, 5),
        ('temp', filtered_float, 7),
        ('pressure', filtered_float, 7),
        ('wind_speed', filtered_float, 7),
        ('wind_dir', filtered_float, 7),
        ('rel_hum', filtered_float, 7),
        ('delta_t', filtered_float, 7),
    ),
)

for row in asccol.parse_data(sys.stdin, Q10):
    print(row)

The program above will transform this input:

Year: 2021  Month: 02  ID: BYD  ARGOS:  8903  Name: Byrd
Lat: 80.02S  Lon: 119.44W  Elev: 1539m
2021  32  2  1 0000  -16.3  803.9    8.9   22.0   79.0  444.0
2021  32  2  1 0010  -16.4  803.9    8.6   25.0   79.0  444.0

...into this output:

row(year=2021, jdate=32, month=2, date=1, time=(0, 0), temp=-16.3, pressure=803.9, wind_speed=8.9, wind_dir=22.0, rel_hum=79.0, delta_t=nan)
row(year=2021, jdate=32, month=2, date=1, time=(0, 10), temp=-16.4, pressure=803.9, wind_speed=8.6, wind_dir=25.0, rel_hum=79.0, delta_t=nan)