@@ -628,25 +628,38 @@ def _encode_datetime_with_cftime(dates, units: str, calendar: str) -> np.ndarray
628628 if cftime is None :
629629 raise ModuleNotFoundError ("No module named 'cftime'" )
630630
631+ dates = np .array (dates )
632+ original_shape = dates .shape
633+
631634 if np .issubdtype (dates .dtype , np .datetime64 ):
632635 # numpy's broken datetime conversion only works for us precision
633636 dates = dates .astype ("M8[us]" ).astype (datetime )
634637
635- def encode_datetime (d ):
636- # Since netCDF files do not support storing float128 values, we ensure
637- # that float64 values are used by setting longdouble=False in num2date.
638- # This try except logic can be removed when xarray's minimum version of
639- # cftime is at least 1.6.2.
640- try :
641- return (
642- np .nan
643- if d is None
644- else cftime .date2num (d , units , calendar , longdouble = False )
645- )
646- except TypeError :
647- return np .nan if d is None else cftime .date2num (d , units , calendar )
638+ dates = np .atleast_1d (dates )
639+
640+ # Find all the None position
641+ none_position = np .equal (dates , None )
642+ filtered_dates = dates [~ none_position ]
643+
644+ # Since netCDF files do not support storing float128 values, we ensure
645+ # that float64 values are used by setting longdouble=False in num2date.
646+ # This try except logic can be removed when xarray's minimum version of
647+ # cftime is at least 1.6.2.
648+ try :
649+ encoded_nums = cftime .date2num (
650+ filtered_dates , units , calendar , longdouble = False
651+ )
652+ except TypeError :
653+ encoded_nums = cftime .date2num (filtered_dates , units , calendar )
654+
655+ if filtered_dates .size == none_position .size :
656+ return encoded_nums .reshape (original_shape )
648657
649- return reshape (np .array ([encode_datetime (d ) for d in ravel (dates )]), dates .shape )
658+ # Create a full matrix of NaN
659+ # And fill the num dates in the not NaN or None position
660+ result = np .full (dates .shape , np .nan )
661+ result [np .nonzero (~ none_position )] = encoded_nums
662+ return result .reshape (original_shape )
650663
651664
652665def cast_to_int_if_safe (num ) -> np .ndarray :
0 commit comments