-
Notifications
You must be signed in to change notification settings - Fork 2
Description
Describe the bug
Depending on the function the format of the returned time coordinates seems to differ. While a dataset created with e.g. pd.daterange() has the type np.datatime64[ns] , the return value of test_ts.coords['time'].loc[{'time': [np.datetime64('1970-01-01')]}] has the datatype np.datetime64[D]
Failing Test
Below a test I constructed to show the behaviour. It fails because (I think) the internal date conversion of xr.polyfit and xr.polyval use the format of the np.datetime64 variables to convert the dates to integers used for the actual fitting and evaluation. The example below works if the dates are manually specified as having nanosecond resolution.
import numpy as np
import pandas as pd
import pytest
import xarray as xr
from primap2.tests.utils import assert_aligned_equal
def test_temp_polyval():
test_ts = xr.DataArray(
np.linspace(6, 12, 11),
coords={"time": pd.date_range("1970-01-01", "1980-01-01", freq="YS")},
dims="time",
name="test_ts",
)
fit = test_ts.polyfit(dim='time', deg=1, skipna=True)
value = xr.polyval(
test_ts.coords['time'].loc[{'time': [np.datetime64('1970-01-01')]}], # specify 'ns' for test to pass
fit.polyfit_coefficients
)
value.name='test_ts' # for assertion
assert_aligned_equal(
test_ts.loc[{'time': [np.datetime64('1970-01-01')]}], # specify 'ns' for test to pass
value,
rtol=1e-04,
)
Expected behavior
It would be good if the date resolution is fixed without having to specify it manually. It would also be good if it's e.g. days and not nanoseconds (but not necessary unless nanoseconds has a negative impact on the fits)
System (please complete the following information):
Linux mint 22
Additional context
In the filling strategy code I'm currently writing I use nanosecond for now, because that seems to be the default behaviour of pd.date_range. But a pr.loc[{'time': ['1999-01-01]}] gives days back, so it's not a general solution to just be specific in the new code.