Skip to main content

finance dates

Fast date ranges, holiday calendars, and trading hours for financial markets

Build Status codecov License PyPI

Overview

finance-dates provides calendar-aware date utilities for the finance-* stack. The Rust core handles holiday-rule expansion, weekend observance, early closes, and DST-aware regular and extended trading sessions; the Python package exposes a compact API for date series, exchange calendars, and open/close timestamps.

The library is useful when you need to answer questions like:

  • What are the valid trading dates for NYSE between two dates?
  • Which dates in a range are holidays or otherwise invalid for a venue?
  • Is a UTC timestamp inside a market session after DST and early closes?
  • What are the UTC open/close datetimes for regular and extended trading windows?

Quick start

from datetime import date, datetime, timezone

from finance_dates import Calendar
from finance_enums import EnergyType, ExchangeCode, UnderlyingAssetClass

c = Calendar.from_range(start=date(2024, 1, 1), end=date(2024, 1, 5))

# Inclusive plain calendar dates.
c.days()

# Mon-Fri only, holiday-blind.
c.business_days()

# Exchange-aware calendar with holidays, sessions, and early closes.
nyse = Calendar.from_exchange("XNYS")
nyse.business_days(date(2024, 7, 1), date(2024, 7, 5))
nyse.holidays(date(2024, 7, 1), date(2024, 9, 30))
nyse.sessions(date(2024, 7, 1), date(2024, 7, 5))
nyse.extended_sessions(date(2024, 7, 1), date(2024, 7, 5))
nyse.is_open(datetime(2024, 3, 11, 13, 30, tzinfo=timezone.utc))

gas = Calendar.from_asset(
  ExchangeCode.XNYM,
  UnderlyingAssetClass.Commodity,
  subclass=EnergyType.NaturalGas,
)
gas.regular_sessions

For US equity calendars, regular_sessions contains the standard 09:30-16:00 New York session template, while extended_hours includes pre_open and after_close templates. On early-close days, the after-close window begins at the early close.

Calendars with lunch breaks expose multiple regular session templates. For example, Tokyo (XTKS) currently returns separate 09:00-11:30 and 12:30-15:30 local sessions, and sessions() returns one UTC open/close pair per regular interval. Tokyo is date-effective around the 2024-11-05 close-time extension, so historical dates before that change close at 15:00 local while current dates close at 15:30.

Commodity futures can also use split sessions. Prefer Calendar.from_asset() with finance-enums exchange and asset/subclass enum members, or their string values, when you know the instrument vocabulary; for example ExchangeCode.XNYM plus EnergyType.NaturalGas resolves to the NYMEX energy template without requiring synthetic names like NYMEX_ENERGY. Synthetic product-group codes such as CBOT_GRAINS and product mnemonics such as CL or ZC remain accepted by from_exchange() for lower-level calendar inspection and compatibility.

Exchange and country calendars

Calendars cover US equities, options, bonds, and futures alongside major international equity venues across the Americas, Europe, the Middle East, Africa, and Asia-Pacific. Each international venue has a dedicated national holiday rule set, including lunar (China, Hong Kong, Korea, Taiwan), Islamic (Saudi Arabia, Turkey, UAE), and Hebrew (Israel) calendars, plus computed rules such as the Japanese equinoxes.

Calendars can be resolved by exchange/MIC code or by ISO country code:

from finance_dates import Calendar
from finance_enums import EnergyType, ExchangeCode, UnderlyingAssetClass

Calendar.from_exchange("XLON")   # London Stock Exchange
Calendar.from_exchange("XTKS")   # Tokyo Stock Exchange, split lunch sessions
Calendar.from_exchange("XKRX")   # Korea Exchange, lunar holidays
Calendar.from_exchange("XCME")   # CME futures-style overnight sessions
Calendar.from_exchange("CBOT_GRAINS")  # CBOT grain/oilseed futures sessions
Calendar.from_exchange("CME_ENERGY")  # Globex energy-category alias
Calendar.from_asset(ExchangeCode.XNYM, UnderlyingAssetClass.Commodity, subclass=EnergyType.NaturalGas)
Calendar.from_product("ICE_US", "Sugar")  # ICE US product-specific template
Calendar.from_exchange("FOREX")  # 24x5 FX family
Calendar.from_region("US")       # representative US equity calendar

Calendar.from_exchange() accepts additional resolver-only calendar aliases such as CBOT_GRAINS, CME_ENERGY, CL, and ZC; those are documented in the Calendars page.

Polars integration

When Polars is installed, importing finance_dates registers a .fdates namespace on expressions and series for business-day shifting, business-day alignment, and day-count fractions. The top-level period_grid() helper buckets a date column into period boundaries.

import polars as pl
from finance_dates import period_grid

df = pl.DataFrame({"trade": [date(2024, 7, 3), date(2024, 12, 24)]})
df.with_columns(
    settle=pl.col("trade").fdates.shift_business_days(2, exchange="XNYS"),
    bucket=period_grid(pl.col("trade"), "1mo"),
)

Documentation

See the Calendars page for supported concepts, market families, date-series patterns, and trading-hours conventions. See the API page for the public Python API and recipes.

Rust crate

The Rust library crate is published as finance-dates and imported as finance_dates in Rust code:

[dependencies]
finance-dates = "0.4.0"
use finance_dates::{calendar_for_exchange, date_range};

Metadata

Release files for finance-dates 0.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for finance-dates 0.4.1
File Size Uploaded Provenance
finance_dates-0.4.1.tar.gz 703.2 kB Without provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for finance-dates 0.4.1
File Interpreter ABI Platform
finance_dates-0.4.1-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
finance_dates-0.4.1-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details
finance_dates-0.4.1-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details

Total release size: 2.3 MB

Release files / finance_dates-0.4.1.tar.gz

Download URL finance_dates-0.4.1.tar.gz
Size 703.2 kB
Tags Source
SHA-256 checksum
How to use checksums
e873097942b86ddf3f565701c611bd41097f2f89b8de89f4301157979fc7d014
BLAKE2b-256 checksum
How to use checksums
ad2cc2a59b6619466b27401761d4012b9377ea2592fca6a760ef28b993be180d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / finance_dates-0.4.1-cp311-abi3-win_amd64.whl

Download URL finance_dates-0.4.1-cp311-abi3-win_amd64.whl
Size 450.9 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
f533d1e4fd99bc598bc84b775386a37ac4716355f6933bcc5d00e06f64771267
BLAKE2b-256 checksum
How to use checksums
13219be22a29845303f626a3e83d97c71a725c195b57bf059820115475042998
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / finance_dates-0.4.1-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL finance_dates-0.4.1-cp311-abi3-manylinux_2_28_x86_64.whl
Size 644.5 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
1f4b542752c1b947a33d31b685e026dc66bf8ac539e7485e35a0e431ae580227
BLAKE2b-256 checksum
How to use checksums
163300b78a54fd26ff2465c7da1b4f879149aa90eb188b688e7b78f59dd37092
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / finance_dates-0.4.1-cp311-abi3-macosx_11_0_arm64.whl

Download URL finance_dates-0.4.1-cp311-abi3-macosx_11_0_arm64.whl
Size 547.7 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
318f423ed1665afbbe5352cd2da15771bc4b285d0421691090edbed168c01dd8
BLAKE2b-256 checksum
How to use checksums
77f28f253037a7937c42dc9dfc1190ceb6c27680b8c27b19cf5331b9a7eb2764
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Security for finance-dates 0.4.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page