@@ -74,11 +74,25 @@ def _access_through_series(values, name):
74
74
months = values_as_series .dt .month .values
75
75
field_values = _season_from_months (months )
76
76
elif name == "isocalendar" :
77
+ # special NaT-handling can be removed when
78
+ # https://github.com/pandas-dev/pandas/issues/54657 is resolved
79
+ field_values = values_as_series .dt .isocalendar ()
80
+ # test for <NA> and apply needed dtype
81
+ hasna = any (field_values .year .isnull ())
82
+ if hasna :
83
+ field_values = np .dstack (
84
+ [
85
+ getattr (field_values , name ).astype (np .float64 , copy = False ).values
86
+ for name in ["year" , "week" , "day" ]
87
+ ]
88
+ )
89
+ else :
90
+ field_values = np .array (field_values , dtype = np .int64 )
77
91
# isocalendar returns iso- year, week, and weekday -> reshape
78
- field_values = np .array (values_as_series .dt .isocalendar (), dtype = np .int64 )
79
92
return field_values .T .reshape (3 , * values .shape )
80
93
else :
81
94
field_values = getattr (values_as_series .dt , name ).values
95
+
82
96
return field_values .reshape (values .shape )
83
97
84
98
@@ -110,7 +124,7 @@ def _get_date_field(values, name, dtype):
110
124
from dask .array import map_blocks
111
125
112
126
new_axis = chunks = None
113
- # isocalendar adds adds an axis
127
+ # isocalendar adds an axis
114
128
if name == "isocalendar" :
115
129
chunks = (3 ,) + values .chunksize
116
130
new_axis = 0
@@ -119,7 +133,12 @@ def _get_date_field(values, name, dtype):
119
133
access_method , values , name , dtype = dtype , new_axis = new_axis , chunks = chunks
120
134
)
121
135
else :
122
- return access_method (values , name ).astype (dtype , copy = False )
136
+ out = access_method (values , name )
137
+ # cast only for integer types to keep float64 in presence of NaT
138
+ # see https://github.com/pydata/xarray/issues/7928
139
+ if np .issubdtype (out .dtype , np .integer ):
140
+ out = out .astype (dtype , copy = False )
141
+ return out
123
142
124
143
125
144
def _round_through_series_or_index (values , name , freq ):
0 commit comments