tensorflow_ops/datetime_ops.py (75 lines of code) (raw):
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Python wrapper for BigQuery datetime custom ops."""
from bigquery_ml_utils.tensorflow_ops.load_module import load_module
gen_datetime_ops = load_module("_datetime_ops.so")
def datetime_from_components(year, month, day, hour, minute, second, name=None):
"""Returns datetime using INT64 values representing the components of it.
Equivalent SQL: DATETIME(year, month, day, hour, minute, second)
Args:
year: tf.Tensor of type int64 representing the year.
month: tf.Tensor of type int64 representing the month.
day: tf.Tensor of type int64 representing the day.
hour: tf.Tensor of type int64 representing the hour.
minute: tf.Tensor of type int64 representing the minute.
second: tf.Tensor of type int64 representing the second.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_from_components(
year=year,
month=month,
day=day,
hour=hour,
minute=minute,
second=second,
name=name,
)
def datetime_from_date(date, name=None):
"""Returns datetime using DATE value.
Equivalent SQL: DATETIME(date_expression)
Args:
date: tf.Tensor of type string in "%F" format.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_from_date(date=date, name=name)
def datetime_from_date_and_time(date, time, name=None):
"""Returns datetime using DATE value and TIME value.
Equivalent SQL: DATETIME(date_expression, time_expression)
Args:
date: tf.Tensor of type string in "%F" format.
time: tf.Tensor of type string in "%H:%M:%E6S" format.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_from_date_and_time(
date=date, time=time, name=name
)
def datetime_from_timestamp(timestamp, time_zone="UTC", name=None):
"""Returns datetime using TIMESTAMP value and optional time zone.
Equivalent SQL: DATETIME(timestamp_expression [, time_zone])
Args:
timestamp: tf.Tensor of type string in "%F %H:%M:%E1S %z" format.
time_zone: Optional. A string represents the time zone.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_from_timestamp(
timestamp=timestamp, time_zone=time_zone, name=name
)
def cast_to_datetime_from_string(
datetime_string, format_string=None, name=None
):
"""Returns a datetime by casting a string.
Equivalent SQL: CAST(string AS DATETIME [FORMAT format_string])
Args:
datetime_string: tf.Tensor of type string. The string must conform to the
supported datetime literal format, and is independent of time zone. If the
string expression is invalid or represents a datetime that is outside of
the supported min/max range, then an error is produced.
format_string: tf.Tensor of type string. A string which contains format
elements.
name: An optional name for the op.
"""
return gen_datetime_ops.cast_to_datetime_from_string(
datetime_string=datetime_string,
format_string="" if format_string is None else format_string,
with_format=format_string is not None,
name=name,
)
def datetime_add(datetime, interval, part, name=None):
"""Returns the added DATETIME with the interval of part.
Equivalent SQL:
DATETIME_ADD(datetime_expression, INTERVAL int64_expression part)
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
interval: tf.Tensor of type int64. It has the same shape of datetime input.
part: A string represents the datetime part. Can be MICROSECOND,
MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. It is
case insensitive.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_add(
datetime=datetime, interval=interval, part=part, name=name
)
def datetime_diff(datetime_a, datetime_b, part, name=None):
"""Returns the number of specified part intervals between two DATETIME.
Equivalent SQL:
DATETIME_DIFF(datetime_a, datetime_b, part)
Args:
datetime_a: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
datetime_b: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
part: A string represents the datetime part. Can be MICROSECOND,
MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, WEEK(<WEEKDAY>), ISOWEEK,
MONTH, QUARTER, YEAR, ISOYEAR. It is case insensitive.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_diff(
datetime_a=datetime_a, datetime_b=datetime_b, part=part, name=name
)
def datetime_sub(datetime, interval, part, name=None):
"""Returns the subtracted DATETIME with the interval of part.
Equivalent SQL:
DATETIME_SUB(datetime_expression, INTERVAL int64_expression part)
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
interval: tf.Tensor of type int64. It has the same shape of datetime input.
part: A string represents the datetime part. Can be MICROSECOND,
MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. It is
case insensitive.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_sub(
datetime=datetime, interval=interval, part=part, name=name
)
def datetime_trunc(datetime, part, name=None):
"""Returns the truncated DATETIME value to the granularity of date_time_part.
Equivalent SQL:
DATETIME_TRUNC(datetime_expression, part)
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
part: A string represents the datetime part. Can be MICROSECOND,
MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR. It is
case insensitive.
name: An optional name for the op.
"""
return gen_datetime_ops.datetime_trunc(
datetime=datetime, part=part, name=name
)
def extract_from_datetime(datetime, part, name=None):
"""Returns the specified part from a supplied datetime.
Equivalent SQL: EXTRACT(part FROM datetime)
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
part: A string represents the datetime part. Can be MICROSECOND,
MILLISECOND, SECOND, MINUTE, HOUR, DAYOFWEEK, DAY, DAYOFYEAR, WEEK,
WEEK(WEEKDAY), ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR. It is case
insensitive.
name: An optional name for the op.
"""
return gen_datetime_ops.extract_from_datetime(
datetime=datetime, part=part, name=name
)
def extract_date_from_datetime(datetime, name=None):
"""Returns the DATE part from a supplied datetime.
Equivalent SQL: EXTRACT(DATE FROM datetime)
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
name: An optional name for the op.
"""
return gen_datetime_ops.extract_date_from_datetime(
datetime=datetime, name=name
)
def extract_time_from_datetime(datetime, name=None):
"""Returns the TIME part from a supplied datetime.
Equivalent SQL: EXTRACT(TIME FROM datetime)
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
name: An optional name for the op.
"""
return gen_datetime_ops.extract_time_from_datetime(
datetime=datetime, name=name
)
def last_day_from_datetime(datetime, part="MONTH", name=None):
"""Returns the last day from a datetime that contains the date.
Equivalent SQL: LAST_DAY(datetime[, part])
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
part: A string represents the datetime part. Can be WEEK, WEEK(WEEKDAY),
ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR. It is case insensitive.
name: An optional name for the op.
"""
return gen_datetime_ops.last_day_from_datetime(
datetime=datetime, part=part, name=name
)
def format_datetime(format_string, datetime, name=None):
"""Returns the datetime string based on the format_string.
Equivalent SQL: FORMAT_DATETIME(format_string, datetime_expression)
Args:
format_string: tf.Tensor of type string. A string represents the format of
the datetime value.
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
name: An optional name for the op.
"""
return gen_datetime_ops.format_datetime(
format_string=format_string, datetime=datetime, name=name
)
def parse_datetime(format_string, datetime_string, name=None):
"""Returns the parsed DATETIME value based on the format_string.
Equivalent SQL:
PARSE_DATETIME(format_string, datetime_string)
Args:
format_string: A string represents the format of the datetime value.
datetime_string: tf.Tensor of type string.
name: An optional name for the op.
"""
return gen_datetime_ops.parse_datetime(
format_string=format_string, datetime_string=datetime_string, name=name
)
def safe_parse_datetime(format_string, datetime_string, name=None):
"""Returns the safely parsed DATETIME value based on the format_string.
Equivalent SQL: SAFE.PARSE_DATETIME(format_string, datetime_string). Returns
"1970-01-01 00:00:00.000000" for unsuccessful parsing.
Args:
format_string: A string represents the format of the datetime value.
datetime_string: tf.Tensor of type string.
name: An optional name for the op.
"""
return gen_datetime_ops.safe_parse_datetime(
format_string=format_string, datetime_string=datetime_string, name=name
)