[docs]defpreprocess(self,df:pd.DataFrame)->pd.DataFrame:"""Turn datetime variables into int64 (seconds since epoch)."""df=df.copy()self.datetime_variables=[colforcolindf.columnsifstr(df[col].dtype).startswith("datetime")]forcolindf.columns:ifcolnotinself.datetime_variables:continueepoch=np.datetime64(0,"Y")# 0 years since epoch ==> epoch itselfdf[col]=(df[col].to_numpy()-epoch)/np.timedelta64(10**9,"ns")df[col]=df[col].astype(float)# Necessary, else its float64returndf
[docs]defpostprocess(self,source:pd.DataFrame,dest:pd.DataFrame)->pd.DataFrame:"""Transform datetime columns from seconds since epoch back to datetime[ns] type."""default_value=0fornameinself.datetime_variables:# Replace NaN values with default_value, convert to datetime[ns] and replace with NaT# afterwardsis_nan=dest[name].isna()dest[name]=dest[name].fillna(default_value)dest[name]=pd.to_datetime(dest[name].astype("int64")*10**9,unit="ns")dest[name]=dest[name].where(~is_nan,pd.NaT)returndest