tooltime
tooltime makes it simple to represent and manipulate many different representations of time
tooltime operates on 4 abstract time datatypes:
| meaning | example | |
|---|---|---|
Timestamp |
a moment in time | today at 3:03 PM |
Timelength |
a length of time | four minutes |
Timeperiod |
a period with a start and an end | from 3:03 PM to 3:07 PM today |
Timefrequency |
a rate | every four minutes |
Each datatype has multiple interconvertible representations using native python types
Install
pip install tooltime
Contents
Example Usage
Convert Timelength Representations
import tooltime
tooltime.timelength_to_seconds('10m')
> 600
tooltime.timelength_to_label(600)
> '10m'
tooltime.timelength_to_clock('10m')
> '0:10:00'
tooltime.timelength_to_phrase('10m')
> '10 minutes'
(
tooltime.timelength_to_seconds(600)
== tooltime.timelength_to_seconds('10m')
== tooltime.timelength_to_seconds('0:10:00')
== tooltime.timelength_to_seconds('10 minutes')
)
> True
Introspect Time Data
# load data
timestamps = load_data(...)
# summarize sequence
tooltime.print_timestamp_summary(timestamps)
n_t: 216
n_unique: 216
extent:
start: 20210117_201840Z (1610914720.757)
end: 20210118_235708Z (1611014228.542)
duration: 1 days, 3:38:27.785000 (99507.785000086 s)
resolution:
median_dt: 4m
mean_dt: 462s
missing timestamps: 200 (if median_dt maintained)
outlier_dts: 20
small: 8 dt < median_dt / (1 + outlier_rtol)
large: 12 dt > median_dt * (1 + outlier_rtol)
(outlier_rtol = 0.5)
Create Standardized Timeperiods
Create timeperiods whose boundaries are integer multiples of some block_unit. These useful for placing erratically distributed timestamps into regular bins
timestamp = 1600000000
block_size = 3
print('timestamp:', tooltime.timestamp_to_label(timestamp))
print()
print('standardized timeperiods containing timestamp:')
for block_unit in ['day', 'hour', 'minute']:
timeperiod = tooltime.get_standard_timeperiod(
timestamp=timestamp,
block_size=block_size,
block_unit=block_unit,
)
block_str = str(block_size) + ' ' + block_unit
timeperiod_str = tooltime.timeperiod_to_str(timeperiod)
print(' %8s' % block_str + ':', timeperiod_str)
timestamp: 20200913_122640Z
standardized timeperiods containing timestamp:
3 day: [20200913_000000Z, 20200915_235959Z]
3 hour: [20200913_120000Z, 20200913_145959Z]
3 minute: [20200913_122400Z, 20200913_122659Z]
Datatype Representations
each of the 4 time datatypes has multiple interconvertible representations, and each representation is assembled from native python types:
Timestamp Representations
| python type | example | |
|---|---|---|
TimestampSeconds |
int seconds since UTC epoch |
1600000000 |
TimestampSecondsPrecise |
float seconds since UTC epoch |
1600000000.0 |
TimestampLabel |
str in format '%Y%m%d_%H%M%SZ' |
'20200913_122640Z' |
TimestampISO |
str in ISO 8601 format |
'2020-09-13T12:26:40Z' |
TimestampISOPretty |
str in ISO 8601 format, prettier |
'2020-09-13 12:26:40Z' |
TimestampDatetime |
datetime.datetime object |
datetime.datetime.now() |
TimestampYear |
str of year |
2020 |
TimestampMonth |
str of dashed year and month |
2020-09 |
TimestampMonthCompact |
str of plain year and month |
202009 |
TimestampDate |
str of dashed date |
2020-09-13 |
TimestampDateCompact |
str of plain date |
20200913 |
Timelength Representations
| python type | example | |
|---|---|---|
TimelengthSeconds |
int seconds |
310 |
TimelengthSecondsPrecise |
float seconds |
310.0 |
TimelengthLabel |
str of '{number}{time_unit}' |
'310s' |
TimelengthClock |
str of '{hours}:{minutes}:{seconds}' |
'0:05:10' |
TimelengthPhrase |
str of comma-separated list of English amounts |
'5 minutes, 10 seconds' |
TimelengthClockPhrase |
str of TimelengthPhrase modulo 1 day, remainder in TimelengthClock |
'3 days, 0:05:10' |
TimelengthTimedelta |
datetime.timedelta object |
datetime.timedelta(3, 310) |
valid time units are 's', 'm', 'h', 'd', 'w', 'M', and 'y', indicating seconds, minutes, hours, days, weeks, months, and years
Timeperiod Representations
| python type | example | |
|---|---|---|
TimeperiodMap |
dict in form {'start': 'Timestamp', 'end': 'Timestamp'} |
{'start': 1600000000, 'end': 1600000001} |
TimeperiodPair |
list in form [start, end] |
[1600000000, 1600000001] |
Timefrequency Representations
| python type | example | |
|---|---|---|
TimefrequencyFrequency |
int or float of cycles per second |
5.0 |
TimefrequencyCountPer |
dict in form {'count': ['int', 'float'], 'per': 'Timelength'} |
{'count': 5, 'per': '1s'} |
TimefrequencyInterval |
dict in form {'interval': 'Timelength'} |
{'interval': 0.2} |
Function Reference
- all functions can be accessed using syntax
tooltime.<function_name>(...) tooltimecontains many functions, but most derive from one of the following patterns:
| operation type | template (functions that are more specific will have better performance) | description |
|---|---|---|
| identification | is_<datatype>() |
return bool of whether input is instance of datatype |
| identification | is_<datatype>_<representation>() |
return bool of whether input is instance of specific datatype representation |
| identification | detect_<datatype>_representation() |
return str of datatype representation name |
| creation | create_<datatype>() |
create datatype |
| creation | create_<datatype>_<representation>() |
create datatype with specific representation |
| conversion | convert_<datatype>() |
convert datattype representation |
| conversion | convert_<datatype>_to_<representation>() |
convert datatype to specific representation |
| conversion | convert_<datatype>_<representation>_to _<representation>() |
convert datatype with known representation to specific representation |
All functions for each datatype are listed below
Identification Functions
| example call | example output | |
|---|---|---|
is_timestamp() |
is_timestamp('hello') |
False |
is_timestamp_seconds() |
is_timestamp_seconds(610) |
True |
is_timestamp_label() |
is_timestamp_label(610) |
False |
is_timestamp_iso() |
is_timestamp_iso( '2020-09-13T12:26:40Z') |
True |
is_timestamp_datetime() |
is_timestamp_datetime(610) |
False |
detect_timestamp _representation() |
detect_timestamp_representation( 610) |
'TimestampSeconds' |
is_timelength() |
is_timelength('10m') |
True |
is_timelength_seconds() |
is_timelength_seconds('10m') |
False |
is_timelength_label() |
is_timelength_label('10m') |
True |
is_timelength_clock() |
is_timelength_clock('10m) |
False |
is_timelength_phrase() |
is_timelength_phrase('10 minutes') |
True |
is_timelength_clock_phrase() |
is_timelength_clock_phrase('10m') |
False |
is_timelength_timedelta() |
is_timelength_timedelta('10 minutes') |
False |
detect_timelength _representation() |
detect_timelength_representation( '10m') |
'TimelengthLabel' |
is_timeperiod() |
is_timeperiod({'start': 1600000000, 'end': 1600000001'}) |
True |
is_timeperiod_map() |
is_timeperiod_map({'start': 1600000000, 'end': 1600000001'}) |
True |
is_timeperiod_pair() |
is_timeperiod_length({'start': 1600000000, 'end': 1600000001'}) |
False |
detect_timeperiod _representation() |
detect_timeperiod_representation( {'start': 1600000000, 'end': 1600000001'}) |
'TimeperiodMap' |
is_timefrequency() |
is_timefrequency({'interval': 0.2}) |
True |
is_timefrequency_frequency() |
is_timefrequency_frequency( {'interval': 0.2}) |
False |
is_timefrequency_count_per() |
is_timefrequency_count_per( {'interval': 0.2}) |
False |
is_timefrequency_interval() |
is_timefrequency_interval( {'interval': 0.2}) |
True |
detect_timefrequency _representation() |
detect_timefrequency _representation({'interval': 0.2}) |
'TimefrequencyInterval' |
Creation Functions
| example call | example output | |
|---|---|---|
create_timestamp_seconds() |
create_timestamp_seconds() |
1600000000 |
create_timestamp_label() |
create_timestamp_label() |
'20200913_122640Z' |
create_timestamp_iso() |
create_timestamp_iso() |
'2020-09-13T12:26:40Z' |
create_timestamp_datetime() |
create_timestamp_datetime() |
'2020-09-13T12:26:40Z' |
create_timelength() |
create_timelength(seconds=310, to_representation= 'TimelengthLabel') |
'310s' |
create_timelength_seconds() |
create_timelength_seconds( seconds=310) |
310 |
create_timelength_seconds_precise() |
create_timelength_seconds _precise(seconds=310) |
310.0 |
create_timelength_label() |
create_timelength_label( seconds=310) |
'310s' |
create_timelength_clock() |
create_timelength_clock( seconds=310) |
'0:05:10' |
create_timelength_phrase() |
create_timelength_phrase( seconds=310) |
'5 minutes, 10 seconds' |
create_timelength_clock_phrase() |
create_timelength_clock_phrase( seconds=310) |
'0:05:10' |
create_timelength_timedelta() |
create_timelength_timedelta( seconds=310) |
datetime.timedelta(0, 310) |
create_timeperiod() |
create_timeperiod( start=1600000000, length=1) |
{'start': 1600000000, 'end': 1600000001} |
create_timeperiod_map() |
create_timeperiod_map( start=1600000000, length=1) |
{'start': 1600000000, 'end': 1600000001} |
create_timeperiod_pair() |
create_timeperiod_pair( start=1600000000, length=1) |
[1600000000, 1600000001] |
create_timefrequency() |
create_timefrequency(count=5, per=1) |
5.0 |
create_timefrequency_frequency() |
create_timefrequency_frequency( count=5, per=1) |
5.0 |
create_timefrequency_count_per() |
create_timefrequency_count_per( count=5, per=1) |
{'count': 5, 'per': 1} |
create_timefrequency_interval() |
create_timefrequency_interval( interval=0.2) |
{'interval': 0.2} |
Conversion Functions
Timestamp Conversion Functions
| example call | example output | |
|---|---|---|
convert_timestamp() |
convert_timestamp(1600000000, 'TimestampLabel') |
'20200913_122640Z' |
timestamp_to_seconds() |
timestamp_to_seconds( '20200913_122640Z') |
1600000000 |
timestamp_to_label() |
timestamp_to_label(1600000000) |
'20200913_122640Z' |
timestamp_to_iso() |
timestamp_to_iso(1600000000) |
'2020-09-13T12:26:40Z' |
timestamp_to_datetime() |
timestamp_to_datetime(1600000000) |
datetime.datetime(2020, 9, 13, 12, 26, 40) |
timestamp_seconds_to_label() |
timestamp_seconds_to_label( 1600000000) |
'20200913_122640Z' |
timestamp_label_to_seconds() |
timestamp_label_to_seconds( '20200913_122640Z') |
1600000000 |
timestamp_seconds_to_iso() |
timestamp_seconds_to_iso(1600000000) |
'2020-09-13T12:26:40Z' |
timestamp_iso_to_seconds() |
timestamp_iso_to_seconds( '2020-09-13T12:26:40Z') |
1600000000 |
Timelength Conversion Functions
| example call | example output | |
|---|---|---|
convert_timelength() |
convert_timelength(1600000000, 'TimestampLabel') |
'20200913_122640Z' |
timelength_to_seconds() |
timelength_to_seconds(610) |
610 |
timelength_to_phrase() |
timelength_to_phrase(610) |
'10 minutes, 10 seconds' |
timelength_to_clock() |
timelength_to_clock(610) |
'0:10:10' |
timelength_to_clock_phrase() |
timelength_to_clock_phrase( 259810) |
'3 days, 0:10:10' |
timelength_seconds_to_label() |
timelength_seconds_to_label(600) |
'10m' |
timelength_seconds_to_clock() |
timelength_seconds_to_clock(610) |
'0:10:10' |
timelength_seconds_to_phrase() |
timelength_seconds_to_phrase(610) |
'10 minutes, 10 seconds' |
timelength_seconds_to_clock_phrase() |
timelength_seconds_to_clock _phrase(600) |
'3 days, 0:05:10' |
timelength_seconds_to_timedelta() |
timelength_seconds_to_timedelta( 259810) |
datetime.timedelta( 3, 610) |
timelength_label_to_seconds() |
timelength_label_to_seconds( '10m') |
600 |
timelength_clock_to_seconds() |
timelength_clock_to_seconds( '0:10:10') |
610 |
timelength_phrase_to_seconds() |
timelength_phrase_to_seconds('10 minutes') |
610 |
timelength_clock_phrase_to_seconds() |
timelength_clock_phrase_to _seconds( '3 days, 0:05:10') |
259510 |
timelength_timedelta_to_seconds() |
timelength_timedelta_to_seconds( timedelta) |
259510 |
Timeperiod Conversion Functions
| example call | example output | |
|---|---|---|
convert_timeperiod() |
convert_timeperiod({'start': 1600000000, 'end': 1600000001}, 'TimePeriodStartLength') |
{'start': 1600000000, 'length': 1} |
convert_timeperiod_to_start_end() |
convert_timeperiod_to_start_end( {'start': 1600000000, 'end': 1600000001}, 'TimePeriodStartLength') |
{'start': 1600000000, 'end': 1600000001} |
convert_timeperiod_to_start_length() |
convert_timeperiod_to_start_length( {'start': 1600000000, 'end': 1600000001}, 'TimePeriodStartLength') |
{'start': 1600000000, 'length': 1} |
convert_timeperiod_to_end_length() |
convert_timeperiod_to_end_length( {'start': 1600000000, 'end': 1600000001}, 'TimePeriodStartLength') |
{'end': 1600000001, 'length': 1} |
Timefrequency Conversion Functions
| example call | example output | |
|---|---|---|
convert_timefrequency() |
convert_timefrequency({'count': 5, 'per': '1s'}, 'TimeInterval') |
{'interval': 0.5} |
convert_timefrequency_to_frequency() |
convert_timefrequency_to_frequency( {'interval': 0.2}) |
5.0 |
convert_timefrequency_to_count_per() |
convert_timefrequency_to_count_per( {'interval': 0.2}) |
{'count': 5, 'per': '1s'} |
convert_timefrequency_to_interval() |
convert_timefrequency_to_interval( {'count': 5, 'per': '1s'}) |
{'interval': 0.2} |
Specialized Functions
these are functions that are specific to each datatype
| datatype | function | description |
|---|---|---|
Timestamp |
floor_datetime() |
return floor of datetime to specified unit of precision |
Timestamp |
get_unit_lowest_value() |
return int of lowest possible for value for a given time unit |
Timestamp iterable |
print_timestamp_summary() |
print a variety of summary statistics about Timestamps |
Timeperiod |
timeperiods_overlap() |
return bool of whether Timeperiods have any overlap |
Timeperiod |
timeperiod_contains() |
return bool of whether Timeperiod contains other Timeperiod |
Timeperiod |
create_superset_timeperiod() |
create Timeperiod that contains all input Timeperiods |
Timeperiod |
create_overlapping_timeperiod() |
create copy of Timeperiod with start or end trimmed or extended by relative or absolute amounts |
Timeperiod |
get_standard_timeperiod() |
get standardized Timeperiod whose boundaries are integer multiples of some block_unit |
Timefrequency |
detect_resolution() |
detect resolution of iterable of Timestamp |
Frequently Asked Questions
How are timezones handled?
All Timestamp representations except TimestampDatetime are linked to specific timezone, which in most cases is GMT (UTC). Counts of seconds since epoch (as in TimestampSeconds and TimestampSecondsPrecise) are conventionally always GMT (UTC). TimestampLabel and TimestampISO use a military time zone abbreviation as their last characters. The datetime object of TimestampDatetime internally represents a count of seconds since epoch, but datetime objects can have implicit or explicit timezones depending on how they are instantiated.
Why not just use datetime?
datetimedoes not handle timezones in a simple or explicit way.datetimedoes not make it easy to ingest, output, or convert representations of time using primitive python types.tooltimecontains different convenience functions thandatetimethat are better suited for different workloads.
What do the T and Z mean in an ISO 8601 timestamp, such as "2020-09-13T12:26:40Z"?
The T character separates the date portion of the timestamp from the time portion. The Z character indicates the GMT (UTC) timezone. Each timezone has its own letter. Read more here.
Metadata
Release files for tooltime 0.3.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| tooltime-0.3.5.tar.gz | 36.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tooltime-0.3.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 80.0 kB
Release files / tooltime-0.3.5.tar.gz
| Download URL | tooltime-0.3.5.tar.gz |
|---|---|
| Size | 36.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4de33e516f306ab71907dd159e6532ff99fe1c8f93cd36c0346e2031a80f4539
|
|
BLAKE2b-256 checksum How to use checksums |
29e94d10e4fc4a605107bf80840372d00520d532e14cc86ac575efba75d43f36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.0
|
Release files / tooltime-0.3.5-py3-none-any.whl
| Download URL | tooltime-0.3.5-py3-none-any.whl |
|---|---|
| Size | 43.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eb93d531dabb8f09c5967b337d9f78c20076f72a0e4d98eb95d1bb64cb1edd27
|
|
BLAKE2b-256 checksum How to use checksums |
2febcbf28b371d9ac0d2b4f647fe9abbd38c7a4b87b0d2d608672ef0699ef774
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.0
|
Security for tooltime 0.3.5
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.