2012-11-23 17 views
5

Chciałbym tworzyć wektory obiektów NumPy datetime64 z wektorów 1-D z lat, miesięcy i dni, a także iść w odwrotnym kierunku, czyli wyodrębnić wektory lat, miesięcy lub dni z dziennego wektora datetime64. Używam NumPy 1.7.0b2.Wektoryzacja operacji rok/miesiąc/dzień z NumPy datetime64

Na przykład, załóżmy

years = [1990, 1992, 1995, 1994] 
months = [1, 6, 3, 7] 
days = [3, 20, 14, 27] 

Teraz chcę utworzyć wektor np.datetime64 długości 4 Korzystanie z tych lat, miesięcy i dni. Czy istnieje sposób bez użycia pętli Pythona?

Idąc w przeciwnym kierunku, przypuśćmy, że dates to wektor typu np.datetime64, a częstotliwość jest codziennie. Wtedy będę mógł uzyskać coś takiego jak x.DAYS() i odzyskać wektor [3, 20, 14, 27].

Odpowiedz

0

Nie wiem o sposób to zrobić bez jakiejś pętli, ale inlined to kawałek z listowego:

years = [1990, 1992, 1995, 1994] 
months = [1, 6, 3, 7] 
days = [3, 20, 14, 27] 
np.array(['{0[0]}-{0[1]}-{0[2]}'.format(x) for x in zip(years, months, days)], dtype='datetime64') 

Wracając inną drogę, trzeba przekonwertować każdy przedmiot do zwykłego datetime. Możesz to zrobić, dzwoniąc pod numer astype(object), który działa dla całej tablicy lub dla pojedynczych obiektów. To, które robisz, prawdopodobnie zależy od tego, w jaki sposób korzystasz z danych.

2
import numpy as np 
def combine64(years, months=1, days=1, weeks=None, hours=None, minutes=None, 
       seconds=None, milliseconds=None, microseconds=None, nanoseconds=None): 
    years = np.asarray(years) - 1970 
    months = np.asarray(months) - 1 
    days = np.asarray(days) - 1 
    types = ('<M8[Y]', '<m8[M]', '<m8[D]', '<m8[W]', '<m8[h]', 
      '<m8[m]', '<m8[s]', '<m8[ms]', '<m8[us]', '<m8[ns]') 
    vals = (years, months, days, weeks, hours, minutes, seconds, 
      milliseconds, microseconds, nanoseconds) 
    return sum(np.asarray(v, dtype=t) for t, v in zip(types, vals) 
       if v is not None) 

years = [1990, 1992, 1995, 1994] 
months = [1, 6, 3, 7] 
days = [3, 20, 14, 27] 

print(combine64(years, months, days)) 

daje

array(['1990-01-03', '1992-06-20', '1995-03-14', '1994-07-27'], dtype='datetime64[D]') 
Powiązane problemy