hours()#
#hours(n: int|Producer) -> Expression
Creates a period of n
hours.
Negative values are supported.
If n
is a Producer
object, then hours()
also acts as a filter and removes non-integer values from the producer.
Unlike years()
, months()
, or days()
, hours()
can only be added or subtracted from datetime values.
Must be called in a rule or query context.
Parameters#
Name | Type | Description |
---|---|---|
n | Producer or Python int | The number of hours. |
Returns#
An Expression
object.
Example#
Use hours()
to create a period of n
hours.
You can add and subtract time periods from datetime values using the +
and -
operators:
#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_hours=1)
Event.add(id=2).set(start=dates.datetime(2021, 2, 1, 9, 30), duration_hours=-2)
Event.add(id=3).set(start=dates.date(2021, 3, 1), duration_hours=2)
Event.add(id=4).set(start=dates.date(2021, 4, 1), duration_hours="invalid")
# =======
# EXAMPLE
# =======
with model.rule():
event = Event()
# hours() filters out any events with invalid start or duration_hours values,
# so the following only sets the end property for Events 1 and 2. Event 3 is
# filtered out because it's start property is a date value, while Event 4 has
# both an invalid start and duration_minutes value.
event.set(end=event.start + dates.hours(event.duration_hours))
# 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)
print(response.results)
# id end has_valid_start_and_duration
# 0 1 2021-01-01 10:30:00 True
# 1 2 2021-02-01 07:30:00 True
# 2 3 NaT NaN
# 3 4 NaT NaN
You can add hours()
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_hours = dates.hours(event.duration_hours)
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_hours)
# Otherwise, add the duration without conversion.
with model.case():
event.set(end=event.start + duration_hours)
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 10:30:00
# 1 2 2021-02-01 07:30:00
# 2 3 2021-03-01 02:00:00
# 3 4 NaT
Note that hours()
does not produce an integer value.
In particular, you cannot do arithmetic with hours()
and numeric values:
#with model.query() as select:
result = dates.hours(2) / 24
response = select(result)
# Returns an empty result set because `hours(2) / 24` is not a valid expression.
print(response.results)
# Empty DataFrame
# Columns: []
# Index: []