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 GNU General Public License v3.0 - 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.2.0.tar.gz (819.1 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.2.0-py3-none-any.whl (840.2 kB view details)

Uploaded Python 3

File details

Details for the file x_zic-0.2.0.tar.gz.

File metadata

  • Download URL: x_zic-0.2.0.tar.gz
  • Upload date:
  • Size: 819.1 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.2.0.tar.gz
Algorithm Hash digest
SHA256 b11e4bf7bb0ecf0c120287f06490b005bf8ccbc42a4b0c6395c0a70a998cd9c5
MD5 439a7c1b1e3bdab4560b9e39cd4423da
BLAKE2b-256 6272f63293c85fe006d37ccaa14ea107952d32bee8f5bd3c704ac207413fee33

See more details on using hashes here.

File details

Details for the file x_zic-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: x_zic-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 840.2 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b7e90abebf737665581170bd17735721aadf6f5ac3cbd7ca5b97ee8777759cec
MD5 c4eb28dc309af1f56c64b99f9461cc1c
BLAKE2b-256 5ff041950e9f6467b3ad8044435af5fbfb6f89401243ed29ccbb76ab73b79669

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