Numpy arange with spesifi c datetime с интервалом в месяц - PullRequest
0 голосов
/ 28 марта 2020

Я хочу сделать массив datetime, заданный интервалом месяцев. Это просто, если я использую дни в качестве интервала, подобного этому

xyz = np.arange(np.datetime64('2020-03-24'), 3)
xyz

ВЫХОД

array(['2020-03-24', '2020-03-25', '2020-03-26'], dtype='datetime64[D]')

Он увеличивается только на 3 дня. Как насчет 3 месяцев? Я пробовал этот способ и ОШИБКА

np.arange(datetime('2020-03-28'), np.timedelta64(3,'M'))

Я пробовал это и дает неправильный результат

np.arange(np.datetime64("2020-03-24"), np.datetime64("2020-06-24"), 
          np.timedelta64(1, 'M'), 
          dtype='datetime64[M]').astype('datetime64[D]')

ВЫХОД

array(['2020-03-01', '2020-04-01', '2020-05-01'], dtype='datetime64[D]')

1 Ответ

1 голос
/ 28 марта 2020

Ваш arange без dtype вызывает ошибку:

In [91]: x = np.arange(np.datetime64("2020-03-24"), np.datetime64("2020-06-24"),  
    ...:           np.timedelta64(1, 'M'))                                                     
...
TypeError: Cannot get a common metadata divisor for NumPy datetime metadata [M] and [D] because they have incompatible nonlinear base time units

Шаг за один месяц - это не то же самое, что шаг за n дней.

С dtype:

In [85]: x = np.arange(np.datetime64("2020-03-24"), np.datetime64("2020-06-24"),  
    ...:           np.timedelta64(1, 'M'),  
    ...:           dtype='datetime64[M]')                                                      
In [86]: x                                                                                     
Out[86]: array(['2020-03', '2020-04', '2020-05'], dtype='datetime64[M]')

Конечные точки были преобразованы в месяц (без какой-либо подразумеваемой даты).

Обратите внимание, что различия ожидаются 1 month:

In [87]: np.diff(x)                                                                            
Out[87]: array([1, 1], dtype='timedelta64[M]')

Если я преобразую даты в D dtype, он выберет начало месяца:

In [89]: x.astype('datetime64[D]')                                                             
Out[89]: array(['2020-03-01', '2020-04-01', '2020-05-01'], dtype='datetime64[D]')

Дельта времени даты больше не является равномерной:

In [90]: np.diff(x.astype('datetime64[D]'))                                                    
Out[90]: array([31, 30], dtype='timedelta64[D]')

===

Вместо astype вы можете добавить соответствующую временную дельту:

In [96]: x + np.array(3, 'timedelta64[D]')                                                     
Out[96]: array(['2020-03-04', '2020-04-04', '2020-05-04'], dtype='datetime64[D]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...