@@ -488,7 +488,7 @@ def _decode_datetime_with_pandas(
488
488
flat_num_dates = flat_num_dates .astype (np .float64 )
489
489
490
490
timedeltas = _numbers_to_timedelta (
491
- flat_num_dates , time_unit , ref_date .unit , "datetime "
491
+ flat_num_dates , time_unit , ref_date .unit , "datetimes "
492
492
)
493
493
494
494
# add timedeltas to ref_date
@@ -582,6 +582,7 @@ def _numbers_to_timedelta(
582
582
time_unit : NPDatetimeUnitOptions ,
583
583
ref_unit : PDDatetimeUnitOptions ,
584
584
datatype : str ,
585
+ target_unit : PDDatetimeUnitOptions | None = None ,
585
586
) -> np .ndarray :
586
587
"""Transform numbers to np.timedelta64."""
587
588
# keep NaT/nan mask
@@ -605,13 +606,23 @@ def _numbers_to_timedelta(
605
606
flat_num , cast (PDDatetimeUnitOptions , time_unit )
606
607
)
607
608
if time_unit != new_time_unit :
608
- msg = (
609
- f"Can't decode floating point { datatype } to { time_unit !r} without "
610
- f"precision loss, decoding to { new_time_unit !r} instead. "
611
- f"To silence this warning use time_unit={ new_time_unit !r} in call to "
612
- f"decoding function."
613
- )
614
- emit_user_level_warning (msg , SerializationWarning )
609
+ if target_unit is None or np .timedelta64 (1 , target_unit ) > np .timedelta64 (
610
+ 1 , new_time_unit
611
+ ):
612
+ if datatype == "datetimes" :
613
+ kwarg = "decode_times"
614
+ coder = "CFDatetimeCoder"
615
+ else :
616
+ kwarg = "decode_timedelta"
617
+ coder = "CFTimedeltaCoder"
618
+ formatted_kwarg = f"{ kwarg } ={ coder } (time_unit={ new_time_unit !r} )"
619
+ message = (
620
+ f"Can't decode floating point { datatype } to { time_unit !r} "
621
+ f"without precision loss; decoding to { new_time_unit !r} "
622
+ f"instead. To silence this warning pass { formatted_kwarg } "
623
+ f"to your opening function."
624
+ )
625
+ emit_user_level_warning (message , SerializationWarning )
615
626
time_unit = new_time_unit
616
627
617
628
# Cast input ordinals to integers and properly handle NaN/NaT
@@ -640,7 +651,9 @@ def decode_cf_timedelta(
640
651
_check_timedelta_range (np .nanmin (num_timedeltas ), unit , time_unit )
641
652
_check_timedelta_range (np .nanmax (num_timedeltas ), unit , time_unit )
642
653
643
- timedeltas = _numbers_to_timedelta (num_timedeltas , unit , "s" , "timedelta" )
654
+ timedeltas = _numbers_to_timedelta (
655
+ num_timedeltas , unit , "s" , "timedeltas" , target_unit = time_unit
656
+ )
644
657
pd_timedeltas = pd .to_timedelta (ravel (timedeltas ))
645
658
646
659
if np .isnat (timedeltas ).all ():
0 commit comments