23
23
from pandas .errors import EmptyDataError , OutOfBoundsDatetime
24
24
25
25
import pandas as pd
26
- from pandas import notna
26
+ from pandas import isnull
27
27
28
28
from pandas .io .common import get_handle
29
29
from pandas .io .sas ._sas import Parser
30
30
import pandas .io .sas .sas_constants as const
31
31
from pandas .io .sas .sasreader import ReaderBase
32
32
33
33
34
+ def _parse_datetime (sas_datetime : float , unit : str ):
35
+ if isnull (sas_datetime ):
36
+ return pd .NaT
37
+
38
+ if unit == "s" :
39
+ return datetime (1960 , 1 , 1 ) + timedelta (seconds = sas_datetime )
40
+
41
+ if unit == "d" :
42
+ return datetime (1960 , 1 , 1 ) + timedelta (days = sas_datetime )
43
+
44
+
34
45
def _convert_datetimes (sas_datetimes : pd .Series , unit : str ) -> pd .Series :
35
46
"""
36
47
Convert to Timestamp if possible, otherwise to datetime.datetime.
@@ -52,22 +63,10 @@ def _convert_datetimes(sas_datetimes: pd.Series, unit: str) -> pd.Series:
52
63
try :
53
64
return pd .to_datetime (sas_datetimes , unit = unit , origin = "1960-01-01" )
54
65
except OutOfBoundsDatetime :
55
- if unit == "s" :
56
- s_series = sas_datetimes .apply (
57
- lambda sas_float : datetime (1960 , 1 , 1 ) + timedelta (seconds = sas_float )
58
- if notna (sas_float )
59
- else pd .NaT
60
- )
66
+ if unit in ["s" , "d" ]:
67
+ s_series = sas_datetimes .apply (_parse_datetime , unit = unit )
61
68
s_series = cast (pd .Series , s_series )
62
69
return s_series
63
- elif unit == "d" :
64
- d_series = sas_datetimes .apply (
65
- lambda sas_float : datetime (1960 , 1 , 1 ) + timedelta (days = sas_float )
66
- if notna (sas_float )
67
- else pd .NaT
68
- )
69
- d_series = cast (pd .Series , d_series )
70
- return d_series
71
70
else :
72
71
raise ValueError ("unit must be 'd' or 's'" )
73
72
0 commit comments