Skip to main content

Pythonic timezone compiler based on tzdb

Project description

TZDB Parser

A high-performance Python library for parsing and analyzing the IANA Time Zone Database (tzdb). Built for production use with smart caching, minimal dependencies, and a practical API.

Features

  • 🚀 Blazing Fast: Smart caching system for instant subsequent loads
  • 📦 Zero Dependencies: Pure Python standard library
  • 🏗️ Production Ready: Robust error handling and validation
  • 🔍 Comprehensive: Full coverage of TZDB files and formats
  • 📊 Multiple Outputs: JSON, dictionaries, pandas DataFrames
  • 🌍 Geographic Data: Timezone coordinates and country mappings
  • Transition Analysis: DST and offset change calculations

Installation

pip install x-zic

Or clone from source:

git clone https://github.com/mlotfic/x-zic
cd x-zic
pip install -e .

Quick Start

from x_zic import read_zones, get_transitions

# Read all timezones (automatically caches for future calls)
zones = read_zones()
print(f"Found {len(zones)} timezones")

# Get DST transitions for New York
transitions = get_transitions('America/New_York', 2020, 2025)
for transition in transitions[:3]:  # Show first 3
    print(f"{transition['timestamp']}: {transition['abbrev']} ({transition['offset_after']})")

Basic Usage

Reading Timezone Data

import x_zic

# Read all zones
all_zones = x_zic.read_zones()

# Read by region
european_zones = x_zic.read_zones('europe')
asian_zones = x_zic.read_zones('asia')

# Parse specific files
from x_zic.parser import parse_zone, parse_rule
zones = parse_zone('northamerica', loader)
rules = parse_rule('europe', loader)

Working with Transitions

# Get DST transitions
transitions = x_zic.get_transitions(
    'America/Los_Angeles', 
    start_year=2020, 
    end_year=2025
)

# Analyze transition patterns
for t in transitions:
    print(f"{t['timestamp']} | {t['abbrev']:>4} | "
          f"{t['offset_before']}{t['offset_after']} | "
          f"DST: {t['is_dst']}")

Geographic Data

from x_zic.geo import read_zonetab

# Get timezones with coordinates
geo_zones = read_zonetab()
for zone in geo_zones[:5]:
    print(f"{zone['zone_id']} | {zone['country_code']} | "
          f"({zone['latitude']}, {zone['longitude']})")

Advanced Usage

Custom Configuration

from x_zic.core.config import TZDBConfig
from x_zic.core.loader import FileLoader

# Custom setup
config = TZDBConfig(
    tzdb_source_path="/path/to/tzdb-2025b",
    cache_dir="/tmp/tzdb_cache",
    max_transition_years=50
)

loader = FileLoader(config)

Low-level Parsing

from x_zic.parser import parse_zone_line, parse_rule_line

# Parse individual lines
zone_line = "Zone America/New_York -5:00 US E%sT"
zone = parse_zone_line(zone_line)

rule_line = "Rule US 2007 max - Mar Sun>=8 2:00 1:00 D"
rule = parse_rule_line(rule_line)

Analysis and Export

from x_zic.analysis import stats
from x_zic.export import to_dataframe

# Get statistics
zone_stats = stats.count_zones_by_region()
dst_stats = stats.dst_coverage(2024)

# Export to pandas
df_zones = to_dataframe(read_zones())
df_rules = to_dataframe(read_rules())

print(f"Zones per region: {zone_stats}")
print(f"DST coverage: {dst_stats['percentage']:.1f}%")

API Reference

Core Functions

Function Description
read_zones(region=None) Read all zones or specific region
get_transitions(zone_name, start_year, end_year) Get DST/offset transitions
parse_zone_file(filename) Parse specific zone file

Parser Module

Function Description
parse_zone(file, loader) Parse zone file to objects
parse_rule(file, loader) Parse rule file to objects
parse_link(file, loader) Parse link file to objects
parse_leap(file, loader) Parse leap seconds file

Regions Module

Function Description
list_regions() Get available region names
get_zones_by_region(region, loader) Get zones from region
get_rules_by_region(region, loader) Get rules from region

Data Models

Zone

{
    'name': 'America/New_York',
    'offset': '-5:00', 
    'rules': 'US',
    'format': 'E%sT',
    'until': None,
    'region': 'northamerica'
}

Rule

{
    'name': 'US',
    'from_year': 2007,
    'to_year': 'max',
    'month': 'Mar',
    'day': 'Sun>=8',
    'time': '2:00',
    'save': '1:00',
    'letter': 'D'
}

Transition

{
    'zone': 'America/New_York',
    'timestamp': '2024-03-10T07:00:00',
    'offset_before': '-05:00',
    'offset_after': '-04:00', 
    'is_dst': True,
    'abbrev': 'EDT'
}

Cache System

The library automatically caches parsed data for instant subsequent loads:

.tzdb_cache/
├── zones.json
├── rules.json
├── links.json
├── leapseconds.json
└── regions.json

Clear cache when needed:

x_zic.clear_cache()

Performance

Operation First Run Cached Run
Load all zones ~500ms ~50ms
Find zone by name ~10ms ~1ms
Calculate transitions ~100ms ~20ms

File Support

The parser handles all standard TZDB files:

  • Region Files: africa, asia, europe, northamerica, etc.
  • Legacy Files: backward, backzone
  • Geographic Data: zone.tab, zone1970.tab, iso3166.tab
  • Leap Seconds: leapseconds, leap-seconds.list
  • Compiled Data: tzdata.zi

Examples

Find All DST-Observing Zones

zones = read_zones()
dst_zones = [
    zone for zone in zones 
    if zone['rules'] not in ['-', '', None]
]
print(f"Found {len(dst_zones)} DST-observing zones")

Calculate Offset Changes

transitions = get_transitions('Europe/London', 2023, 2024)
for t in transitions:
    change = "DST Start" if t['is_dst'] else "DST End"
    print(f"{t['timestamp'][:10]}: {change} ({t['abbrev']})")

Geographic Queries

from x_zic.geo import read_zonetab

geo_zones = read_zonetab()
us_zones = [z for z in geo_zones if z['country_code'] == 'US']

for zone in us_zones:
    print(f"{zone['zone_id']} - {zone['comments']}")

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit changes (git commit -m 'Add amazing feature')
  4. Push to branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Testing

# Run all tests
python -m pytest tests/

# Run with coverage
python -m pytest --cov=x_zic tests/

# Specific test module
python -m pytest tests/test_parser.py -v

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

  • IANA Time Zone Database for maintaining the official timezone data
  • Python datetime and zoneinfo modules for inspiration
  • Contributors and users of the library

Support


Ready to parse timezones? Install the library and start with the Quick Start guide!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

x_zic-0.1.1.dev1.tar.gz (785.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

x_zic-0.1.1.dev1-py3-none-any.whl (821.3 kB view details)

Uploaded Python 3

File details

Details for the file x_zic-0.1.1.dev1.tar.gz.

File metadata

  • Download URL: x_zic-0.1.1.dev1.tar.gz
  • Upload date:
  • Size: 785.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for x_zic-0.1.1.dev1.tar.gz
Algorithm Hash digest
SHA256 f705d315ba4491ea7f639120f7ab85797e9fe724907e365669d998179c7f687c
MD5 99e169f5874f6612fe28249f08ed1e5e
BLAKE2b-256 434d89bbdc3089f0987b3df556100f56b9cc9b8b3e81f27652b2931a7b8586cc

See more details on using hashes here.

File details

Details for the file x_zic-0.1.1.dev1-py3-none-any.whl.

File metadata

  • Download URL: x_zic-0.1.1.dev1-py3-none-any.whl
  • Upload date:
  • Size: 821.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for x_zic-0.1.1.dev1-py3-none-any.whl
Algorithm Hash digest
SHA256 95d0ed47fc6b0c6893b71fca31d6722c1a8a741e2b91265fd5d949834232ff0a
MD5 1ccb2a7d304bf30db485993a2bd74fd7
BLAKE2b-256 0f651412d283b5c4257d207a0651ae72f209a2d79687457f65e81928badda035

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page