Skip to content
Snippets Groups Projects
Owen Graham's avatar
Owen Graham authored
48905b41
Name Last commit Last update
.gitignore
README.md
asccol.py

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
from asccol import DataSpec, Columns, parse_data

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 = DataSpec(
    leading=2,  # lines to delete
    cols=Columns(
        ('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 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)