Получить год, месяц или день с numpy datetime64

У меня есть массив типа datetime64:

dates = np.datetime64(['2010-10-17', '2011-05-13', "2012-01-15"]) 

Есть ли лучший способ, чем цикл через каждый элемент, чтобы получить np.array лет:

  • Как преобразовать дату и время на дату (в Python)?
  • Создайте временную метку RFC 3339 в Python
  • Преобразование временных меток со смещением в datetime obj с использованием strptime
  • Сумма набора значений из кадра данных pandas в течение определенного временного интервала
  • Как форматировать строку даты через несколько форматов в python
  • Преобразование даты строки в метку времени в Python
  •  years = f(dates) #output: array([2010, 2011, 2012], dtype=int8) #or dtype = string 

    Я использую стабильную версию numpy 1.6.2.

  • Разбор даты, которая может быть в нескольких форматах в python
  • Существует ли встроенная функция numpy, чтобы отклонять выбросы из списка
  • проблема с присвоением массива numpy
  • Попытка разобрать текстовые файлы в python для анализа данных
  • Networkx: Различия между pagerank, pagerank_numpy и pagerank_scipy?
  • Многомерная сплайн-интерполяция в python / scipy?
  • 8 Solutions collect form web for “Получить год, месяц или день с numpy datetime64”

    Поскольку datetime нестабильно в numpy, я бы использовал pandas для этого:

     In [52]: import pandas as pd In [53]: dates = pd.DatetimeIndex(['2010-10-17', '2011-05-13', "2012-01-15"]) In [54]: dates.year Out[54]: array([2010, 2011, 2012], dtype=int32) 

    Pandas использует numpy datetime внутри, но, похоже, избегает нехватки, которая имеет значение numpy до сих пор.

    Я считаю, что следующие трюки дают между увеличением 2x и 4x по сравнению с описанным выше методом pandas (т.е. pd.DatetimeIndex(dates).year и т. Д.). Скорость [dt.year for dt in dates.astype(object)] Я нахожу похожим на метод pandas. Также эти трюки могут быть применены непосредственно к ndarrays любой формы (2D, 3D и т. Д.),

     dates = np.arange(np.datetime64('2000-01-01'), np.datetime64('2010-01-01')) years = dates.astype('datetime64[Y]').astype(int) + 1970 months = dates.astype('datetime64[M]').astype(int) % 12 + 1 days = dates - dates.astype('datetime64[M]') + 1 

    Должен быть более простой способ сделать это, но, в зависимости от того, что вы пытаетесь сделать, лучшим способом может быть преобразование в обычный объект datetime Python :

     datetime64Obj = np.datetime64('2002-07-04T02:55:41-0700') print datetime64Obj.astype(object).year # 2002 print datetime64Obj.astype(object).day # 4 

    Основываясь на комментариях ниже, это, похоже, работает только в Python 2.7.x не Python 3.x

    Если вы обновляетесь до numpy 1.7 (где дата-время все еще отображается как экспериментальное), то следующее должно работать.

     dates/np.timedelta64(1,'Y') 

    К сожалению, нет прямого способа сделать это, но есть несколько косвенных способов:

     [dt.year for dt in dates.astype(object)] 

    или

     [datetime.datetime.strptime(repr(d), "%Y-%m-%d %H:%M:%S").year for d in dates] 

    оба вдохновлены примерами здесь .

    Оба они работают для меня на Numpy 1.6.1. Возможно, вам понадобится быть более осторожным со вторым, так как функция rep () для datetime64 может иметь дробную часть после десятичной точки.

    Используя numpy версию 1.10.4 и версию pandas 0.17.1,

     dates = np.array(['2010-10-17', '2011-05-13', '2012-01-15'], dtype=np.datetime64) pd.to_datetime(dates).year 

    Я получаю то, что вы ищете:

     array([2010, 2011, 2012], dtype=int32) 

    Другая возможность:

     np.datetime64(dates,'Y') - returns - numpy.datetime64('2010') 

    или

     np.datetime64(dates,'Y').astype(int)+1970 - returns - 2010 

    но работает только на скалярные значения, не будет принимать массив

    Ответ Anon отлично работает для меня, но мне просто нужно изменить заявление в течение days

    из:

     days = dates - dates.astype('datetime64[M]') + 1 

    чтобы:

     days = dates.astype('datetime64[D]') - dates.astype('datetime64[M]') + 1 
    Python - лучший язык программирования в мире.