Получить дни как плавающие из массива Timedelta и NaN - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть простая проблема, которая доставляет мне немало хлопот: у меня есть большой 2D-массив, который представляет собой смесь datetime.Timedelta объектов и np.nan, упрощенно выглядит так:

tdarray = np.array([dt.timedelta(days=5), np.nan]) 

Теперь я хочу получить дни и число с плавающей запятой / целое число от объекта timedelta, оставляя np.nan как есть, то есть результат должен быть np.array([ 5., nan]).

Получить дни из объекта timedelta легкос .days, и применяя функцию, массив должен работать, например, с np.fromiter, а затем изменять форму.Но как мне отловить ошибку, которая возникает при попытке получить дни от NaN?Я попытался замаскировать, но это также не удается с AttributeError, что MaskedArray не имеет атрибута days.Есть ли простое решение?

1 Ответ

0 голосов
/ 20 сентября 2018

Используйте тот факт, что np.nan является единственным объектом, не равным себе.Обратите внимание, что если ваш массив содержит другие объекты, у них должен быть определен оператор равенства, иначе это вызовет ошибку.

tdarray = np.asarray([dt.timedelta(days=5), np.nan])
mask = tdarray == tdarray  # This gives array([True, False])
tdarray[mask] = [x.days for x in tdarray[mask]]
# Optionally cast to float
tdarray = tdarray.astype(np.float64)

Или вы можете просто перестроить массив

tdarray = np.asarray([x.days if x == x else x for x in tdarray],
                     dtype=np.float64)

Иесли tdarray является массивом ND (N> 1), тогда

shape = tdarray.shape
tdarray = np.asarray([x.days if x == x else x 
                      for x in tdarray.ravel()],
                      dtype=np.float64).reshape(shape)
...