mikelowry
mikelowry

Reputation: 1727

How would I get the number of days in a month with numpy datetime64

What is the easiest and most pythonic way to get the number of days in a month given a np.datetime64 value.

For example: '2020-01-31T00:00:00.000000000' = 31

I'm trying to find something equivalent to Pandas.daysinmonth, but for numpy.

#pd.daysinmonth example:
p = pd.Period('2018-2-17')
p.days_in_month
28

Upvotes: 0

Views: 997

Answers (1)

Sayandip Dutta
Sayandip Dutta

Reputation: 15872

You can use pandas functions on np.datetime64 objects:

>>> ts = np.datetime64('2020-01-31T00:00:00.000000000')
>>> ts
numpy.datetime64('2020-01-31T00:00:00.000000000')
>>> pd.Period(ts, freq='D').days_in_month
31

Or, using np.datetime_as_string:

>>> pd.Period(np.datetime_as_string(ts)).days_in_month
31

Here's a pure numpy solution, although I'm mildly positive there exists a better one.

>>> ts = np.datetime64('2020-01-31T00:00:00.000000000')
>>> def days_in_month(ts):
        ts_month = ts.astype('datetime64[M]')
        return (
            ((ts_month+1).astype('datetime64[D]') - ts_month) 
            // np.timedelta64(1, 'D')
         )
>>> days_in_month(ts)
31

It is vectorized and reasonably fast:

>>> arr = np.arange('2000-01', '2021-12', dtype='datetime64[D]')

>>> arr.shape
(8005,)

>>> %timeit days_in_month(arr)
586 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Upvotes: 2

Related Questions