2012-12-27 5 views
12

I data.table yeni sürümü ve özellikle HARİKA fread fonksiyonunu kullanıyorum. Dosyalarım, 01APR2008:09:00:00 gibi görünen dizeler olarak yüklenen tarihleri ​​(başka türlü bilmemek için bilmiyorum) içerir.döküm dize doğrudan IDateTime

Verileri o tarihler üzerine sıralamalıyım ve sonra sıralama IDateTime biçiminde (ya da henüz bilmediğim başka bir şey) yayınlanmak için verimli olmalıdır. Ben DT[ , newType := IDateTime(strptime(oldType, "%d%b%Y:%H:%M:%S"))] yapamaz gibi

> strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S") 
[1] "2008-04-01 09:00:00" 

> IDateTime(strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")) 
     idate itime 
1: 2008-04-01 09:00:00 

> IDateTime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S") 
Error in charToDate(x) : 
character string is not in a standard unambiguous format 

görünüyor.

Sorularım sonra şunlardır:

  1. fread den IDateTime doğrudan döküm için bir yolu böyle, var mıdır ben sıralamak sonra verimli olabilir ki? Ben
+0

Veri dosyalarınıza nasıl baktıklarını gösterebiliyor musunuz? – agstudy

+0

Merhaba, dosya "sep ="; "' ile bir csv dosyasıdır ve tarih biçimi "01APR2008: 09: 00: 00" 'biçimindedir;" biçim = "% d% b% Y:% H: % M:% S " '. Yaptığım şey "DT [, tarih: = IDate (eskiType,"% d% b% Y ")] DT [, time: = ITime (eskiType,"% d% b% Y:% H:% M :% S ")] ve son olarak setkeyv (DT, c (" tarih "," zaman "))' – statquant

+0

tarih, verilerinizin ilk sütunu mu? – agstudy

cevap

11

Ne yazık ki bu datetime sütuna göre DT sıralamak mümkün olmak istiyorum bilerek gitmek en etkili yolu nedir

  • Değilse, (verimlilik için) strptime tarafından desteklenmeyen bir POSIXlt türü, üretir data.table ve her zaman boyutu (tarih başına 40 bayt!) Ve yapısı nedeniyle olacaktır. strftime, çok daha iyi POSIXct üretmesine rağmen, yine de POSIXlt üzerinden yapar. Burada daha fazla bilgi:

    http://stackoverflow.com/a/12788992/403310 
    

    as.Date olarak baz tür fonksiyonları için baktığımızda, çağdan ofset bir tamsayı oluşturarak, çok strptime kullanır (garip bir şekilde) çift olarak depolanır. data.table'daki IDate (ve arkadaşları) sınıfı, tamsayı olarak depolanan tamsayı çağırma ofsetlerini elde etmeyi amaçlamaktadır. base::sort.list(method = "radix") ile hızlı sıralama için uygundur (bu gerçekten sayma sıralamadır). IDate gerçekten hızlı (genellikle bir kapalı) dönüşümde olmayı hedeflemiyor.

    Yani haklı olarak, dize tarihleri ​​/ kere dönüştürmek ya da yanlış, benim kendi yardımcı işlevi rulo eğilimindedir.

    Dize tarihi "2012-12-24" ise: as.integer(gsub("-", "", col)) yönüne doğru ilerleyin ve YYYYMMDD tamsayı tarihleri ​​ile devam edin. Benzer şekilde, tamsayı olarak HHMMDD olabilir. İki sütun: genellikle bir gün içinde roll = TRUE isterseniz ayrı ayrı date ve time ancak önceki güne, yararlı olabilir. Ay cinsinden gruplandırma basit ve hızlı: by = date %/% 100L. Günlerin eklenmesi ve çıkarılması zahmetli bir durumdur, ancak yine de, hafta içi veya iş günlerinde, takvim günlerini eklemek istemediğiniz nadirdir. Yani iş günü vektörüne bir göz atıyor zaten. Senin durumunda

    karakter ay

    1:12 bir dönüşümü gerekir. Orada "01APR2008" için tarihlerizi bir ayırıcı değil, bu yüzden bir substringmatch veya ay adına fmatch bir takip tek yol olacaktır. Dosya formatını kontrol ediyor musunuz? Eğer öyleyse, sayılar doğal olarak böyle %Y-%m-%d veya %Y%m%d olarak sıralar kesin bir biçimde daha iyi.

    fread içinde henüz en iyi ne yapmam gerektiği için henüz tarih/saat karakter olarak bırakılmamış, çünkü henüz tarih biçimini veya çıktı türünü nasıl algılayacağımı henüz bilmiyorum. Verimsiz karakter yerine, tamsayı veya ikili tarihler çıkarması gerekir.Ben YYYYMMDD tam sayıları kullanım alışılmadık olarak görüldüğünden şüpheleniyorum, bu yüzden bu varsayılan yapmak için biraz tereddüt ediyorum. Onların yerleri var ve ayrıca çağa dayalı tarihlerin artıları ve eksileri var. Tarihler 'un her zaman epoch tabanlı olması için'a sahip olmamı öneriyorum.

    Ne düşünüyorsunuz? Btw, fread'da teşvik için teşekkürler; görmek güzeldi.

  • +0

    Hey Matthew cevap verdiğiniz için teşekkürler, read.csv gibi bir colClasses argümanına izin vermeyi tahmin edebilirim. Her şeyden sonra kendi biçiminizi (başka bir gönderiden aldığım örnekte olduğu gibi) belirtebilirsiniz 'R) setAs (" character "," myDate ", function (from) as.Date (from, format ="% d/% m /% y ")) ' R) system.time (veri <- read.csv (dosya = filePath, sep = ";", dizeleriAsFactors = TRUE, colClasses = c ("factor", "factor") , "numeric", "myDate"), nrows = 10)) '' – statquant

    +0

    Ayrıca, pakete mikro saniye çözme süresi ekleyebiliyorsanız çok daha fazla erkeğe dokunacağınızı düşünüyorum. Tüm HFTrader'lar/quants'lar bu şeylerle oynuyorlar ... (belki de bunun için R'yi kullanmamalılar, ama oraya gitmemeliyiz) – statquant

    +0

    Katkısı, “colClasses” eklenmiş listeye zaten eklenmiş (TO DO listesi freadin üstünde .c), ancak hepsini belirtmek yerine, belirli sütunları geçersiz kılmaya izin veren bir adlandırılmış vektör olarak. Bu gerçekten varsayılan hakkında bir soru oldu. O zaman POSIXct'i düşünüyorum. Bu zaten mikrosenkronları destekler, böylece özel 'data.table'ın gerçekten desteklemesi gereken bir şey olduğunu göremiyorum, iiuc (fring dışındakiler doğrudan ve hızlı bir şekilde yükleyebilir). Korkunç yapmak istediğim ana sebep, genomiklerde olduğu gibi ikili sınırlandırılmış dosyalardı (sep2). –

    1

    Dosyanızın nasıl yapılandırıldığını biliyorum, ancak yorumunuzdan tarih alanını anahtar olarak kullanmak istiyorsunuz. Neden bir zaman dizisi olarak okumaya ve okuma sırasında biçimlendirmeye? İşte

    bunu yapmak için hayvanat bahçesi kullanırlar. (Burada tarih sütun ilk biri olduğunu varsayalım, aksi index.colum argüman bakınız) Eğer tarih doğru biçimde sıralanıp sıralanmış almak

    ff <- function(x) as.POSIXct(strptime(x,"%d%b%Y:%H:%M:%S")) 
    
    h <- read.zoo(text = "03avril2008:09:00:00 125 
             02avril2008:09:30:00 126 
             05avril2008:09:10:00 127 
             04avril2008:09:20:00 128 
             01avril2008:09:00:00 128" 
             ,FUN=ff) 
    

    .

    dönüşüm POSIXct dan IDateTime

    İşte
    IDateTime(index(h)) 
         idate itime 
    1: 2008-04-01 09:00:00 
    2: 2008-04-02 09:30:00 
    3: 2008-04-03 09:00:00 
    4: 2008-04-04 09:20:00 
    5: 2008-04-05 09:10:00 
    

    emin hala 2 dönüşümleri yapmak doğaldır, ama veriyi okurken bunu yapmak ve herhangi bir biçim sorunla ilgilenen olmadan bunu ikinci.