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
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file x_zic-0.2.0.dev0.tar.gz.
File metadata
- Download URL: x_zic-0.2.0.dev0.tar.gz
- Upload date:
- Size: 819.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32c071c6606b0e2121fdcfd0008f931dfccd8585270850f9640e0bde6eecc1dd
|
|
| MD5 |
ebac09eeaf26c21193b575eb368618cd
|
|
| BLAKE2b-256 |
364c8b4e464f444cc982809c45777086bf977fae2e99b2405a2038744bab16aa
|
File details
Details for the file x_zic-0.2.0.dev0-py3-none-any.whl.
File metadata
- Download URL: x_zic-0.2.0.dev0-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b53ffba5c1accccbc328fe07b1f6b0187d55ee4024d043691cc8b3d839e7eb3
|
|
| MD5 |
8ddaa9f764d25004021744bb9ac764fe
|
|
| BLAKE2b-256 |
c356b21fcbecebbad9a9316d1e2f7162f47c7064dbf1edd4e10b5b639d2e85df
|