2012-11-23 5 views
5

Yıllar, aylar ve günlerin 1-D vektörlerinden gelen NumPy datetime64 nesnelerini vektörler oluşturmak ve aynı zamanda yılların vektörlerini ayıklayan ters yöne gitmek istiyorum. günlük datetime64 vektöründen aylar veya günler. NumPy 1.7.0b2 kullanıyorum.NumPy datetime64 ile vektörel yıl/ay/gün operasyonları

Örneğin

,

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

Şimdi bu yıllar, aylar ve günler kullanarak 4 uzunluğunda bir np.datetime64 vektör oluşturmak istediğinizi varsayalım. Python döngüsü kullanmadan bir yolu var mı?

Diğer yöne giderken, varsayalım, dates datatype np.datetime64'ün bir vektörüdür ve sıklık günlükdür. Sonra x.DAYS() gibi bir şey yapabildim ve bir [3, 20, 14, 27] numaralı vektöre geri dönecektim.

cevap

0

Ben döngü çeşit olmadan bunu yapmak için bir yol bilmiyorum, ama liste anlayışı ile bunu biraz inlined:

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

geri başka bir yol gidiyor, her dönüştürmek zorunda öğeye düzenli datetime. Tüm dizi için veya tek tek nesneler için çalışan astype(object) numaralı telefonu arayarak bunu yapabilirsiniz. Hangisini yaptığınız, muhtemelen verilerin nasıl kullanıldığına bağlıdır.

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

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