Skip to content

Make cftime dateoffsets public #5687

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
dcherian opened this issue Aug 10, 2021 · 2 comments
Open

Make cftime dateoffsets public #5687

dcherian opened this issue Aug 10, 2021 · 2 comments

Comments

@dcherian
Copy link
Contributor

Consider the following cftime vector. It's fairly common to see users asking how to subtract "1 month" from this kind of vector:

xr.set_options(display_style="text")
time = xr.DataArray(
    xr.cftime_range("1000-01-01", "1000-05-01", freq="MS", calendar="360_day"), dims="time", name="time"
)
time
<xarray.DataArray 'time' (time: 5)>
array([cftime.Datetime360Day(1000, 1, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 2, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 3, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 4, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 5, 1, 0, 0, 0, 0, has_year_zero=False)],
      dtype=object)
Coordinates:
  * time     (time) object 1000-01-01 00:00:00 ... 1000-05-01 00:00:00

Subtracting pd.Timedelta("1 month") does not work because a month does not represent an absolute unit of time. Instead the solution appears to be:

time - xr.coding.cftime_offsets.MonthBegin(1)
<xarray.DataArray 'time' (time: 5)>
array([cftime.Datetime360Day(999, 12, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 1, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 2, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 3, 1, 0, 0, 0, 0, has_year_zero=False),
       cftime.Datetime360Day(1000, 4, 1, 0, 0, 0, 0, has_year_zero=False)],
      dtype=object)
Coordinates:
  * time     (time) object 1000-01-01 00:00:00 ... 1000-05-01 00:00:00

I think pandas exposes this functionality as pd.DateOffset(months=1). Can we add a similar xr.DateOffset?

@spencerkclark
Copy link
Member

I agree this would be useful functionality. Were you thinking that we would design xr.DateOffset such that it would work for both np.datetime64 values and cftime objects?

@dcherian
Copy link
Contributor Author

Were you thinking that we would design xr.DateOffset such that it would work for both np.datetime64 values and cftime objects?

I think so. It would be very convenient and is similar to the proposed xr.date_range (#5233)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants