2015-08-10 8 views
8

Bir datetime dizisini bir Numba işlevine iletmek istiyorum (bu, vektörleştirilemez ve aksi halde çok yavaş olabilir). Numba'nın numpy.datetime64'ü desteklediğini anlıyorum. Ancak, o datetime64 [D] (gün hassasiyeti) desteklemiyor gibi görünüyor, fakat datetime64 [ns] (milisaniye kesinliği) değil (bunu zor yoldan öğrendim: belgelendi mi?).Python numpy: datetime64 [ns] - datetime64 [D] 'ye dönüştürülemez (Numba ile kullanmak için)

datetime64 [ns] 'tan datetime64 [D]' e dönüştürmeyi denedim, ancak bir yol bulamadık! Herhangi bir fikir?

Sorunumu asgari kodla özetledim. Datetime64 [D] olan testdf(mydates) çalıştırırsanız, iyi çalışır. Eğer datetime64 [ns] olan testdf(dates_input) çalıştırırsanız, o olmaz. Bu örneğin sadece tarihleri ​​(henüz) onlarla hiçbir şey yapmayan Numba işlevine iletir. Date_input öğesini datetime64 [D] 'ye dönüştürmeye çalışıyorum, ancak dönüşüm çalışmıyor. Orijinal kodumda bir SQL tablosundan pandalar veri çerçevesine okudum ve her bir günün tarihini 15'e değiştiren bir sütuna ihtiyacım var.

import numba 
import numpy as np 
import pandas as pd 
import datetime 

mydates =np.array(['2010-01-01','2011-01-02']).astype('datetime64[D]') 
df=pd.DataFrame() 
df["rawdate"]=mydates 
df["month_15"] = df["rawdate"].apply(lambda r: datetime.date(r.year, r.month,15)) 

dates_input = df["month_15"].astype('datetime64[D]') 
print dates_input.dtype # Why datetime64[ns] and not datetime64[D] ?? 


@numba.jit(nopython=True) 
def testf(dates): 
    return 1 

print testf(mydates) 

Ben testdf(dates_input) çalıştırırsanız alıyorum hatadır:

numba.typeinfer.TypingError: Failed at nopython (nopython frontend) 
Var 'dates' unified to object: dates := {pyobject} 
+1

Bu gerçekten yararlı bir sorudur, ancak arama yapmak için bazı nedenlerle bulmak çok zordu. Pandas verileri üzerinde 'np.busday_count' kullanılmaya çalışılırken benzer bir hata aldım, şu okundu: 'TypeError: Iterator işlenen 0 dtype dtype ('

cevap

16

Series.astypedatetime64[ns] için tüm tarih benzeri nesneler dönüştürür. astype çağırmadan önce NumPy dizi elde etmek üzere values kullanın datetime64[D] dönüştürmek için: NDFrames (örneğin Serisi ve DataFrames gibi) sadece d_type datetime64[ns] nesneleri olarak tarih saat benzeri nesneler tutabilir

dates_input = df["month_15"].values.astype('datetime64[D]') 

not edin. Tüm tarihsaat-beğenilerin ortak bir dtype'a otomatik olarak dönüştürülmesi, sonraki tarih hesaplamaları kolaylaştırır. Ancak, DataFrame sütununda datetime64[s] nesnesini saklamak imkansız hale getirir.

In [29]: df['month_15'].astype('datetime64[D]').dtype 
Out[29]: dtype('<M8[ns]') 

Eğer Serisi öğeler arasında yineleme zaman, sen datetime64[ns], pandalar Timestamps değil almak: Pandalar çekirdek geliştiricisi, Jeff Reback explains,

"We don't allow direct conversions because its simply too complicated to keep anything other than datetime64[ns] internally (nor necessary at all)."


Ayrıca d_type datetime64[ns] rağmen df['month_15'].astype('datetime64[D]') sahip olduğuna dikkat s.

In [28]: df['month_15'].astype('datetime64[D]').tolist() 
Out[28]: [Timestamp('2010-01-15 00:00:00'), Timestamp('2011-01-15 00:00:00')] 

Bu nedenle, Numba aslında datetime64[ns] ile ilgili bir sorun olduğu açık değildir, sadece Timestamps ile ilgili bir sorun olabilir. Üzgünüz, bunu kontrol edemiyorum - Numba'nın yüklü olmaması. o zaman gerekmiyor, o çalışırsa

In [31]: df['month_15'].astype('datetime64[D]').values.dtype 
Out[31]: dtype('<M8[ns]') 

: Eğer df['month_15'].astype('datetime64[D]').values beri

testf(df['month_15'].astype('datetime64[D]').values) 

gerçekten d_type datetime64[ns] bir NumPy dizisidir denemek için

Ancak, yararlı olabilir her şeyi datetime64[D]'a dönüştürün, sadece Nums dizilerini değil - Pandas Series'i testf'a geçirmeniz yeterli.

+1

Teşekkür ederiz! Bunun neden olduğunu sorabilir miyim? Demek istediğim, sadece yıl, ay ve gün ile oluşturulan bir tarihin milisaniye hassasiyete dönüştürülmesinin neden bir mantıksal nedenini düşünemiyorum ve .values ​​dediğimiz sürece tekrar günlük kesinliğe dönüştürülemez. Bu bir hata mı? Yoksa burada temel bir neden eksik mi? Herhangi bir yerde belgelenmiş mi? Veri analizi için Python'la olan büyük hayal kırıklığım (ki, evet, biliyorum, Python'un yapabileceği pek çok şeyden sadece biri, ama diğerleriyle ilgilenmiyorum!) Gerçekten de belgelerin kalitesizliği, özellikle de Matlab –

+0

gibi ticari paket Pandalar sizin için genellikle uygun olan pek çok şey yapar. Ne yazık ki, bazen bu, ne istediğinizi (0taslında istediğiniz zaman (tüm tarihleri ​​datetime64 [ns]/Timestamps'a çevirmek gibi) düşündüğünüz şeyleri yapmak anlamına gelir. Bu sorun, bir yerde belgelenmiş olup olmadığını bilmiyorum. – unutbu

+0

, aslında burada olan bitmiyor. Örneğimde, Pandas'ın hangi hassasiyete ihtiyacım olduğunu tahmin etmek zorunda değil (gün veya milisaniye), çünkü Panda'lara açıkça anlatacağım (.astype (datetime64 ['D']). Bu, bir hata gibi daha çok ses çıkarır –