Skip to content

Commit a8bc696

Browse files
authored
fix: Retire the datetime.utcnow(). (feast-dev#4352)
* fix: Retire the datetime.utcnow(). Signed-off-by: Shuchu Han <shuchu.han@gmail.com> * fix: Remove unnecessary unit test. Signed-off-by: Shuchu Han <shuchu.han@gmail.com> --------- Signed-off-by: Shuchu Han <shuchu.han@gmail.com>
1 parent ce4f09b commit a8bc696

File tree

6 files changed

+38
-24
lines changed

6 files changed

+38
-24
lines changed

sdk/python/feast/driver_test_data.py

+31-12
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ def create_orders_df(
6161
df["order_is_success"] = np.random.randint(0, 2, size=order_count).astype(np.int32)
6262
df[DEFAULT_ENTITY_DF_EVENT_TIMESTAMP_COL] = [
6363
_convert_event_timestamp(
64-
pd.Timestamp(dt, unit="ms", tz="UTC").round("ms"),
64+
pd.Timestamp(dt, unit="ms").round("ms"),
6565
EventTimestampType(idx % 4),
6666
)
6767
for idx, dt in enumerate(
68-
pd.date_range(start=start_date, end=end_date, periods=order_count)
68+
pd.date_range(start=start_date, end=end_date, periods=order_count, tz="UTC")
6969
)
7070
]
7171
df.sort_values(
@@ -101,9 +101,13 @@ def create_driver_hourly_stats_df(drivers, start_date, end_date) -> pd.DataFrame
101101
df_hourly = pd.DataFrame(
102102
{
103103
"event_timestamp": [
104-
pd.Timestamp(dt, unit="ms", tz="UTC").round("ms")
104+
pd.Timestamp(dt, unit="ms").round("ms")
105105
for dt in pd.date_range(
106-
start=start_date, end=end_date, freq="1h", inclusive="left"
106+
start=start_date,
107+
end=end_date,
108+
freq="1h",
109+
inclusive="left",
110+
tz="UTC",
107111
)
108112
]
109113
# include a fixed timestamp for get_historical_features in the quickstart
@@ -162,9 +166,13 @@ def create_customer_daily_profile_df(customers, start_date, end_date) -> pd.Data
162166
df_daily = pd.DataFrame(
163167
{
164168
"event_timestamp": [
165-
pd.Timestamp(dt, unit="ms", tz="UTC").round("ms")
169+
pd.Timestamp(dt, unit="ms").round("ms")
166170
for dt in pd.date_range(
167-
start=start_date, end=end_date, freq="1D", inclusive="left"
171+
start=start_date,
172+
end=end_date,
173+
freq="1D",
174+
inclusive="left",
175+
tz="UTC",
168176
)
169177
]
170178
}
@@ -207,9 +215,13 @@ def create_location_stats_df(locations, start_date, end_date) -> pd.DataFrame:
207215
df_hourly = pd.DataFrame(
208216
{
209217
"event_timestamp": [
210-
pd.Timestamp(dt, unit="ms", tz="UTC").round("ms")
218+
pd.Timestamp(dt, unit="ms").round("ms")
211219
for dt in pd.date_range(
212-
start=start_date, end=end_date, freq="1h", inclusive="left"
220+
start=start_date,
221+
end=end_date,
222+
freq="1h",
223+
inclusive="left",
224+
tz="UTC",
213225
)
214226
]
215227
}
@@ -254,9 +266,16 @@ def create_global_daily_stats_df(start_date, end_date) -> pd.DataFrame:
254266
df_daily = pd.DataFrame(
255267
{
256268
"event_timestamp": [
257-
pd.Timestamp(dt, unit="ms", tz="UTC").round("ms")
269+
pd.Timestamp(
270+
dt,
271+
unit="ms",
272+
).round("ms")
258273
for dt in pd.date_range(
259-
start=start_date, end=end_date, freq="1D", inclusive="left"
274+
start=start_date,
275+
end=end_date,
276+
freq="1D",
277+
inclusive="left",
278+
tz="UTC",
260279
)
261280
]
262281
}
@@ -286,11 +305,11 @@ def create_field_mapping_df(start_date, end_date) -> pd.DataFrame:
286305
df["column_name"] = np.random.randint(1, 100, size=size).astype(np.int32)
287306
df[DEFAULT_ENTITY_DF_EVENT_TIMESTAMP_COL] = [
288307
_convert_event_timestamp(
289-
pd.Timestamp(dt, unit="ms", tz="UTC").round("ms"),
308+
pd.Timestamp(dt, unit="ms").round("ms"),
290309
EventTimestampType(idx % 4),
291310
)
292311
for idx, dt in enumerate(
293-
pd.date_range(start=start_date, end=end_date, periods=size)
312+
pd.date_range(start=start_date, end=end_date, periods=size, tz="UTC")
294313
)
295314
]
296315
df["created"] = pd.to_datetime(pd.Timestamp.now(tz=None).round("ms"))

sdk/python/feast/type_map.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ def python_type_to_feast_value_type(
162162
"timestamp": ValueType.UNIX_TIMESTAMP,
163163
"datetime": ValueType.UNIX_TIMESTAMP,
164164
"datetime64[ns]": ValueType.UNIX_TIMESTAMP,
165-
"datetime64[ns, tz]": ValueType.UNIX_TIMESTAMP,
165+
"datetime64[ns, tz]": ValueType.UNIX_TIMESTAMP, # special dtype of pandas
166+
"datetime64[ns, utc]": ValueType.UNIX_TIMESTAMP,
166167
"category": ValueType.STRING,
167168
}
168169

sdk/python/feast/utils.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import typing
66
import warnings
77
from collections import Counter, defaultdict
8-
from datetime import datetime
8+
from datetime import datetime, timezone
99
from pathlib import Path
1010
from typing import (
1111
Any,
@@ -1055,4 +1055,4 @@ def tags_str_to_dict(tags: str = "") -> dict[str, str]:
10551055

10561056

10571057
def _utc_now() -> datetime:
1058-
return datetime.utcnow()
1058+
return datetime.now(tz=timezone.utc)

sdk/python/tests/unit/test_datetime.py

-6
This file was deleted.

sdk/python/tests/utils/feature_records.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime, timedelta
1+
from datetime import datetime, timedelta, timezone
22
from typing import Any, Dict, List, Optional
33

44
import numpy as np
@@ -520,7 +520,7 @@ def get_last_feature_row(df: pd.DataFrame, driver_id, max_date: datetime):
520520
"""Manually extract last feature value from a dataframe for a given driver_id with up to `max_date` date"""
521521
filtered = df[
522522
(df["driver_id"] == driver_id)
523-
& (df["event_timestamp"] < max_date.replace(tzinfo=utc))
523+
& (df["event_timestamp"] < max_date.replace(tzinfo=timezone.utc))
524524
]
525525
max_ts = filtered.loc[filtered["event_timestamp"].idxmax()]["event_timestamp"]
526526
filtered_by_ts = filtered[filtered["event_timestamp"] == max_ts]

sdk/python/tests/utils/test_log_creator.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def prepare_logs(
117117
f"{destination_field}__status"
118118
].mask(
119119
logs_df[f"{destination_field}__timestamp"]
120-
< (_utc_now() - view.ttl),
120+
< (_utc_now() - view.ttl).replace(tzinfo=None),
121121
FieldStatus.OUTSIDE_MAX_AGE,
122122
)
123123

0 commit comments

Comments
 (0)