2012-11-23 9 views
5

Ich möchte Vektoren von NumPy datetime64 Objekten aus 1-D-Vektoren von Jahren, Monaten und Tagen erstellen, und auch die umgekehrte Richtung, die Vektoren von Jahren extrahiert, Monate oder Tage von einem täglichen datetime64-Vektor. Ich benutze NumPy 1.7.0b2.Vektorisierte Jahr/Monat/Tag-Operationen mit NumPy datetime64

Angenommen,

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

nun einen np.datetime64 Vektor der Länge erstellen 4 die Jahre, Monate verwenden und Tage, die ich will. Gibt es einen Weg, ohne eine Python-Schleife zu verwenden?

Gehen Sie in die andere Richtung, angenommen ist ein Vektor des Datentyps np.datetime64 und die Häufigkeit ist täglich. Dann würde ich etwas wie x.DAYS() bekommen und einen Vektor [3, 20, 14, 27] zurückbekommen.

Antwort

0

Ich weiß nicht, von einer Art und Weise, ohne irgendeine Art von Schleife zu tun, aber ich inlined es ein bisschen mit einer Liste Verständnis:

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') 

zurück in die andere Richtung geht, müssen Sie jede konvertieren Artikel zu einem regulären datetime. Sie können dies tun, indem Sie astype(object) aufrufen, die für das gesamte Array oder für einzelne Objekte funktioniert. Welches du tust, hängt wahrscheinlich davon ab, wie du die Daten verwendest.

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)) 

ergibt

array(['1990-01-03', '1992-06-20', '1995-03-14', '1994-07-27'], dtype='datetime64[D]') 
Verwandte Themen