Преобразование pandas datetime в numpy datetime - PullRequest
0 голосов
/ 14 апреля 2020

Довольно простая проблема, которую я не могу понять.

Настройка

Учитывая datetime.date или pandas.datetime Я пытаюсь компенсировать некоторые даты, которые неизбежно будут преобразуется через pandas.to_datetime в объект, который завершается ошибкой при использовании с numpy.busday_offset, как показано в примере ниже.

import numpy as np
import pandas as pd
#Works fine
np.busday_offset(datetime.date(2020, 1, 1), 3)
# Fails
np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)), 3)
# Fails
np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).to_numpy(), 3)
#Works fine
pd.bdate_range(start = datetime.date(2020, 1, 1), 
               end = datetime.date(2020, 4, 14), 
               freq = '20B')
# Fails
np.busday_offset(pd.bdate_range(start = datetime.date(2020, 1, 1), 
                                end = datetime.date(2020, 4, 14), 
                                freq = '20B'), 3)

Вопрос

Каким образом можно go от даты в формате datetime64[ns] (созданной pandas.to_datetime или pandas.bdate_date) до datetime64[D] (которая распознается на numpy.busday_offset?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

В дополнение к ответу Аллена я нашел еще один ответ вместе с некоторыми коллегами

import numpy as np
import pandas as pd
#Works fine
np.busday_offset(datetime.date(2020, 1, 1), 3)
# works fine now
np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).to_numpy().astype('datetime64[D]'), 3)
# works fine now
np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).to_numpy().astype('datetime64[D]'), 3)
#Works fine
pd.bdate_range(start = datetime.date(2020, 1, 1), 
               end = datetime.date(2020, 4, 14), 
               freq = '20B')
# works fine now
np.busday_offset(pd.bdate_range(start = datetime.date(2020, 1, 1), 
                                end = datetime.date(2020, 4, 14), 
                                freq = '20B').to_numpy().astype('datetime64[D]'), 3)
1 голос
/ 14 апреля 2020

Проблема заключается в том, что тип данных, сгенерированный pd.to_datetime, несовместим с np.busday_offset. Сначала его нужно преобразовать в дату.

np.busday_offset(pd.to_datetime(datetime.date(2020, 1, 1)).date(), 3)

Аналогично для date_range вы можете сделать что-то вроде:

drange = pd.bdate_range(start = datetime.date(2020, 1, 1), end = datetime.date(2020, 4, 14),freq = '20B')
np.busday_offset([e.date() for e in drange], 3)
...