microseconds()#

relationalai.std.dates
#microseconds(n: int|Producer) -> Expression

Creates a period of n microseconds. Negative values are supported. If n is a Producer object, then microseconds() also acts as a filter and removes non-integer values from the producer. Unlike years(), months(), or days(), microseconds() can only be added or subtracted from datetime values. Must be called in a rule or query context.

Parameters#

NameTypeDescription
nProducer or Python intThe number of microseconds.

Returns#

An Expression object.

Example#

Use microseconds() to create a period of n microseconds. You can add and subtract time periods from datetime values using the + and - operators:

#import pandas as pd
import relationalai as rai
from relationalai.std import alias, dates


# =====
# SETUP
# =====

model = rai.Model("MyModel")
Event = model.Type("Event")

with model.rule():
    Event.add(id=1).set(start=dates.datetime(2021, 1, 1, 9, 30), duration_microseconds=500)
    Event.add(id=2).set(start=dates.datetime(2021, 2, 1, 9, 30), duration_microseconds=-250)
    Event.add(id=3).set(start=dates.date(2021, 3, 1), duration_microseconds=1000)
    Event.add(id=4).set(start=dates.date(2021, 4, 1), duration_microseconds="invalid")


# =======
# EXAMPLE
# =======

with model.rule():
    event = Event()
    # microseconds() filters out any events with invalid start or duration_microseconds values,
    # so the following only sets the end property for Events 1 and 2. Event 3 is
    # filtered out because its start property is a date value, while Event 4 has
    # both an invalid start and duration_microseconds value.
    event.set(end=event.start + dates.microseconds(event.duration_microseconds))
    # Since Event 3 and 4 are filtered out above, the following only sets the
    # has_valid_start_and_duration property for Events 1 and 2.
    event.set(has_valid_start_and_duration=True)

with model.query() as select:
    event = Event()
    response = select(event.id, event.end, event.has_valid_start_and_duration)

# NOTE: pandas displays datetimes with second precision.
print(response.results)
#    id                 end has_valid_start_and_duration
# 0   1 2021-01-01 09:30:00                         True
# 1   2 2021-02-01 09:30:00                         True
# 2   3                 NaT                          NaN
# 3   4                 NaT                          NaN

You can add microseconds() to date values if you first convert them to datetime values using the datetime.fromdate() constructor:

## Alternative version of the rule in the preceding example that converts any date
# values produced by event.start to datetime values before adding the duration.
with model.rule():
    event = Event()
    duration_microseconds = dates.microseconds(event.duration_microseconds)
    with model.match():
        # If event.start is a date, convert it to a datetime before adding the duration.
        with model.case():
            dates.Date(event.start)
            date_as_time = dates.datetime.fromdate(event.start)
            event.set(end=date_as_time + duration_microseconds)
        # Otherwise, add the duration without conversion.
        with model.case():
            event.set(end=event.start + duration_microseconds)

with model.query() as select:
    event = Event()
    response = select(event.id, event.end)

# Event 4 is still filtered out, but Event 3 now has an end property.
print(response.results)
#    id                     end
# 0   1 2021-01-01 09:30:00.000
# 1   2 2021-02-01 09:30:00.000
# 2   3 2021-03-01 00:00:00.001
# 3   4                     NaT

Note that microseconds() does not produce an integer value. In particular, you cannot do arithmetic with microseconds() and numeric values:

#with model.query() as select:
    result = dates.microseconds(500) / 1000
    response = select(result)

# Returns an empty result set because `microseconds(500) / 1000` is not a valid expression.
print(response.results)
# Empty DataFrame
# Columns: []
# Index: []

See Also#