Skip to main content

Provides a data type for mapping a value to every minute of a year and then resolve a value given a date

Project description

(YEARLY) MINUTE MAP

The idea is you can specify a value (int by default) for any and every minute of an entire year. Which particular year isn't representable. Hierarchical specifiiers and priority matching rules are employed to determine the value for any given minute of the year. A specification takes the form of a set of <expression, value> pairs in JSON or as a dictionary.

An expression is a dot-separated sequence of time tokens. The wildcard "*" may appear as a standalone spec or as a leaf segment, and means "everything else" not matched my siblings at this level.

The method YearMinuteMap.get_value() takes a datetime, and returns a value by selecting the most specific matching spec's value . Example:

my_minute_map =  {
  "*": 8,
  "h5-10": 28,
  "h19": {
    "*": 18,
    "m30-59": 22
  },
  "q2": {
    "h0-4": 10,
    "h5-10": 30,
    "h11-18": 10,
    "h19-23": 20,
  },
  "q3": {
    "h0-4": 12,
    "h5-10": 32,
    "h11-18": 12,
    "h19-23": 20,
    "sun": {
      "h0-4": 14,
      "h5-10": 34,
      "h11-18": 14,
      "h19-23": 23,
    }
  }
}
spec = YearMinuteMap(my_minute_map)
spec.get_value(my_date) # -> value

Input may be a flat or arbitrarily nested dict; nested dicts are flattened by joining their key paths with ".". Both dict and JSON string are accepted. Flat Example:

  {
    "*": 1,
    "q1": 2,
    "q1.sun.h1-10.m1": 3
    "q1.sun.h1-10.m2": 4
  }

EBNF for expression:

SPEC      ::= "*" | PATH
PATH      ::=
  ( QTR | ( "." ( _DOM | _DOW | _HH | MM ) )? )
  | ( MOY | ( "." ( _DOM | _DOW | _HH | MM ) )? )
  | WOY ( "." ( _DOW | _HH | MM ) )?
  | DOY ( "." ( _HH | MM ) )?
  | _DOM
  | _DOW
  | _HH
  | MM
_DOM        = DOM ( "." ( _HH | MM ) )?
_DOW        = DOW ( "." ( _HH | MM ) )?
_HH         = HH ( "." MM )?
QTR       ::= "q1" | "q2" | "q3" | "q4"
MOY       ::= "moy" RANGE      // 1-12
WOY       ::= "woy" RANGE      // 1–53 (ISO weeks can be 53)
DOY       ::= "doy" RANGE      // 1–366
DOM       ::= "dom" RANGE      // 1–31
DOW       ::= "dow" RANGE      // 1-7
HH        ::= "h" RANGE        // 0–23
MM        ::= "m" RANGE        // 0–59
RANGE     ::= DIGITS | DIGITS "-" DIGITS

The grammar does not allow use of the same type of token twice (ex "dom12.dom13") or certain chaining (ex "q1.apr").

MOY and DOW have aliases MONTH and WEEKDAY not shown in EBNF:

MONTH     ::= "jan" | "feb" | "mar" | "apr" | "may" | "jun" |
              "jul" | "aug" | "sep" | "oct" | "nov" | "dec"
WEEKDAY   ::= "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"

Token reference:

    q1..q4          Quarter (maps to moy range internally)
    moy<range>      Month of year    1-12   (aliases: jan…dec)
    woy<range>      ISO week         1-53
    doy<range>      Day of year      1-366
    dom<range>      Day of month     1-31
    dow<range>      Day of week      1-7    (aliases: mon…sun, 1=Mon)
    h<range>        Hour             0-23
    m<range>        Minute           0-59
    *               Wildcard leaf — "match everything from here"
    RANGE ::= DIGITS | DIGITS "-" DIGITS

Tie breaking:

Longer (more dots) paths beat shorter ones. The following order is used for tie breaks (TODO: allow user to specify ordering):

    QTR < MOY < DOW < DOM < WOY < DOY < HH < MM

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

minutemap-0.1.1.tar.gz (8.2 kB view details)

Uploaded Source

Built Distribution

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

minutemap-0.1.1-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file minutemap-0.1.1.tar.gz.

File metadata

  • Download URL: minutemap-0.1.1.tar.gz
  • Upload date:
  • Size: 8.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for minutemap-0.1.1.tar.gz
Algorithm Hash digest
SHA256 9de11bdf246a5d1e5e8af4b8d40f7967eacef51eac9a39716c3ca1ffbb71a019
MD5 4750c44635e7620e43fe186b13b07cf2
BLAKE2b-256 ae68ad84d2246dbd3d1acfc982c935d43458de6eeaf6df9790ef5612febd400b

See more details on using hashes here.

Provenance

The following attestation bundles were made for minutemap-0.1.1.tar.gz:

Publisher: publish.yml on sgpinkus/minutemap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file minutemap-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: minutemap-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 6.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for minutemap-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1736b2afbf6814e3e31d953f09e716bcd98db68672cf6ed1ab138548e2f99454
MD5 3ed39ec8fc45f04d7b794754d74488a5
BLAKE2b-256 16e8466ed9876dd7b1213789a92bd03797dd40ed29cafb31a101dddbd2d95da9

See more details on using hashes here.

Provenance

The following attestation bundles were made for minutemap-0.1.1-py3-none-any.whl:

Publisher: publish.yml on sgpinkus/minutemap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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