tensorflow_ops/date_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 date custom ops."""
from bigquery_ml_utils.tensorflow_ops.load_module import load_module
gen_date_ops = load_module("_date_ops.so")
def extract_from_date(date, part, name=None):
"""Returns the specified part from a supplied date.
Equivalent SQL: EXTRACT(part FROM date)
Args:
date: tf.Tensor of type string. Date in "%F" format.
part: A string represents the date part. Can be DAYOFWEEK, DAY, DAYOFYEAR,
WEEK, WEEK(WEEKDAY), ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR. It is case
insensitive.
name: An optional name for the op.
"""
return gen_date_ops.extract_from_date(date=date, part=part, name=name)
def date_from_components(year, month, day, name=None):
"""Returns a date using INT64 values representing the year, month and day.
Equivalent SQL: DATE(year, month, day)
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.
name: An optional name for the op.
"""
return gen_date_ops.date_from_components(
year=year, month=month, day=day, name=name
)
def date_from_timestamp(timestamp, time_zone="UTC", name=None):
"""Returns a date from a timestamp.
Equivalent SQL: DATE(timestamp_expression, [time_zone_expression])
Args:
timestamp: tf.Tensor of type string. Timestamp in "%F %H:%M:%E1S %z" format.
time_zone: A string represents the timezone. Case sensitive.
name: An optional name for the op.
"""
return gen_date_ops.date_from_timestamp(
timestamp=timestamp, time_zone=time_zone, name=name
)
def date_from_datetime(datetime, name=None):
"""Returns a date from a datetime.
Equivalent SQL: DATE(datetime_expression)
Args:
datetime: tf.Tensor of type string. Datetime in "%F %H:%M:%E6S" format.
name: An optional name for the op.
"""
return gen_date_ops.date_from_datetime(datetime=datetime, name=name)
def date_from_unix_date(num_days, name=None):
"""Returns a date from the number of days since 1970-01-01.
Equivalent SQL: DATE_FROM_UNIX_DATE(int64_expression)
Args:
num_days: tf.Tensor of type int64. The number of days since 1970-01-01.
name: An optional name for the op.
"""
return gen_date_ops.date_from_unix_date(num_days=num_days, name=name)
def cast_to_date_from_string(date_string, format_string=None, name=None):
"""Returns a date by casting a string.
Equivalent SQL: CAST(string AS DATE [FORMAT format_string])
Args:
date_string: tf.Tensor of type string. The string must conform to the
supported date literal format, and is independent of time zone. If the
string expression is invalid or represents a time 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_date_ops.cast_to_date_from_string(
date_string=date_string,
format_string="" if format_string is None else format_string,
with_format=format_string is not None,
name=name,
)
def date_add(date, interval, part, name=None):
"""Returns a date by adding interval to the date.
Equivalent SQL: DATE_ADD(date_expression, INTERVAL int64_expression date_part)
Args:
date: tf.Tensor of type string. Date in "%F" format.
interval: tf.Tensor of type int64. Integer represents the unit of part.
part: A string represents the date part. Can be DAY, WEEK, MONTH, QUARTER,
YEAR. Case insensitive.
name: An optional name for the op.
"""
return gen_date_ops.date_add(
date=date,
interval=interval,
part=part,
name=name,
)
def date_sub(date, interval, part, name=None):
"""Returns a date by subtracting interval to the timestamp.
Equivalent SQL: DATE_SUB(date_expression, INTERVAL int64_expression date_part)
Args:
date: tf.Tensor of type string. Date in "%F" format.
interval: tf.Tensor of type int64. Integer represents the unit of part.
part: A string represents the date part. Can be DAY, WEEK, MONTH, QUARTER,
YEAR. Case insensitive.
name: An optional name for the op.
"""
return gen_date_ops.date_sub(
date=date,
interval=interval,
part=part,
name=name,
)
def date_diff(date_a, date_b, part, name=None):
"""Returns the whole number of specified part intervals between date_a and date_b.
Equivalent SQL: DATE_DIFF(date_expression_a, date_expression_b, date_part)
Args:
date_a: tf.Tensor of type string. Date in "%F" format.
date_b: tf.Tensor of type string. Date in "%F" format.
part: A string represents the date part. Can be DAY, WEEK, WEEK_MONDAY,
WEEK_TUESDAY, WEEK_WEDNESDAY, WEEK_THURSDAY, WEEK_FRIDAY, WEEK_SATURDAY,
ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR. Case insensitive.
name: An optional name for the op.
"""
return gen_date_ops.date_diff(
date_a=date_a,
date_b=date_b,
part=part,
name=name,
)
def date_trunc(date, part, name=None):
"""Returns the whole number of specified part intervals between date_a and date_b.
Equivalent SQL: DATE_DIFF(date_expression_a, date_expression_b, date_part)
Args:
date: tf.Tensor of type string. Date in "%F" format.
part: A string represents the date part. Can be DAY, WEEK, WEEK_MONDAY,
WEEK_TUESDAY, WEEK_WEDNESDAY, WEEK_THURSDAY, WEEK_FRIDAY, WEEK_SATURDAY,
ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR. Case insensitive.
name: An optional name for the op.
"""
return gen_date_ops.date_trunc(
date=date,
part=part,
name=name,
)
def format_date(format_string, date, name=None):
"""Returns a date string based on format_string.
Equivalent SQL: FORMAT_DATE(format_string, date_expr)
Args:
format_string: tf.Tensor of type string. Format of the output string.
date: tf.Tensor of type string. Timestamp in "%F" format.
name: An optional name for the op.
"""
return gen_date_ops.format_date(
format_string=format_string,
date=date,
name=name,
)
def last_day_from_date(date, part="MONTH", name=None):
"""Returns the last day from a date.
Equivalent SQL: LAST_DAY(date[, part])
Args:
date: tf.Tensor of type string. Date in "%F" 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_date_ops.last_day_from_date(date=date, part=part, name=name)
def parse_date(format_string, date_string, name=None):
"""Returns a date by parsing a string.
Equivalent SQL: PARSE_TIMESTAMP(format_string, date_string[, time_zone])
Args:
format_string: tf.Tensor of type string. Format of the string date.
date_string: tf.Tensor of type string. Date in any supported format.
name: An optional name for the op.
"""
return gen_date_ops.parse_date(
format_string=format_string,
date_string=date_string,
name=name,
)
def safe_parse_date(format_string, date_string, name=None):
"""Returns a date by safely parsing a string.
Equivalent SQL: SAFE.PARSE_TIMESTAMP(format_string, date_string[, time_zone]).
Returns "1970-01-01" for unsuccessful parsing.
Args:
format_string: tf.Tensor of type string. Format of the string date.
date_string: tf.Tensor of type string. Date in any supported format.
name: An optional name for the op.
"""
return gen_date_ops.safe_parse_date(
format_string=format_string,
date_string=date_string,
name=name,
)
def unix_date(date, name=None):
"""Returns the number of days since 1970-01-01 by converting a date.
Equivalent SQL: UNIX_DATE(date_expression)
Args:
date: tf.Tensor of type string. Date in "%F" format.
name: An optional name for the op.
"""
return gen_date_ops.unix_date(
date=date,
name=name,
)