Source code for featuretools.primitives.standard.transform.datetime.season

from datetime import date

import pandas as pd
from woodwork.column_schema import ColumnSchema
from woodwork.logical_types import Categorical, Datetime

from featuretools.primitives.base import TransformPrimitive


[docs]class Season(TransformPrimitive): """Determines the season of a given datetime. Returns winter, spring, summer, or fall. This only works for northern hemisphere. Description: Given a list of datetimes, return the season of each one (`winter`, `spring`, `summer`, or `fall`). Examples: >>> from datetime import datetime >>> times = [datetime(2019, 1, 1), ... datetime(2019, 4, 15), ... datetime(2019, 7, 20), ... datetime(2019, 12, 30)] >>> season = Season() >>> season(times).tolist() ['winter', 'spring', 'summer', 'winter'] """ name = "season" input_types = [ColumnSchema(logical_type=Datetime)] return_type = ColumnSchema(logical_type=Categorical, semantic_tags={"category"}) def get_function(self): def season(x): # https://stackoverflow.com/a/28688724/2512385 Y = 2000 # dummy leap year to allow input X-02-29 (leap day) seasons = [ ("winter", (date(Y, 1, 1), date(Y, 3, 20))), ("spring", (date(Y, 3, 21), date(Y, 6, 20))), ("summer", (date(Y, 6, 21), date(Y, 9, 22))), ("fall", (date(Y, 9, 23), date(Y, 12, 20))), ("winter", (date(Y, 12, 21), date(Y, 12, 31))), ] x = x.apply(lambda x: x.replace(year=2000)) def get_season(dt): for season, (start, end) in seasons: if not pd.isna(dt) and start <= dt.date() <= end: return season return pd.NA new = x.apply(get_season).astype(dtype="string") return new return season