2012-11-30 12 views
12

Mam CSV, który zawiera około 2 milionów wierszy łańcuchach daty w formacie:Speedup konwersja 2 miliony wierszy nieaktualne ciągów POSIX.ct

2012/11/13 21:10:00 

Umożliwia połączenie, które csv$Date.and.Time

I chcesz przekonwertować te daty (i towarzyszące im dane) do XTS tak szybko, jak to możliwe

Napisałem scenariusz, który wykonuje konwersję dobrze (patrz poniżej), ale jest strasznie powolny i chciałbym to przyspieszyć maksymalnie jak to możliwe.

Oto moja aktualna metodologia. Czy ktoś ma jakieś sugestie, jak zrobić to szybciej?

dt <- as.POSIXct(csv$Date.and.Time,tz="UTC") 

idx <- format(dt,tz=z,usetz=TRUE) 

Tak więc skrypt konwertuje te łańcuchy daty na POSIX.ct. Następnie następuje konwersja strefy czasowej przy użyciu format (z jest zmienną reprezentującą TZ, do której konwertuję). Następnie wykonuję regularne wywołanie xts, aby utworzyć serię xts wraz z resztą danych w pliku CSV.

Działa to w 100%. Jest po prostu bardzo, bardzo powolny. Próbowałem uruchomić to równolegle (to nic nie robi, jeśli cokolwiek to pogarsza). Co mam na myśli przez "wolny"?

user system elapsed 
155.246 16.430 171.650 

To na 3GhZ, 16GB pamięci ram 2012 mb pro. Mogę dostać o połowę mniej więcej na podobnym procesorze z pamięcią 32 GB na maszynie Win7

Jestem pewien, że ktoś ma lepszy pomysł - jestem otwarty na sugestie za pośrednictwem Rcpp itd. Jednak, idealnie rozwiązanie działa z csv zamiast jakiejś innej metody, takiej jak utworzenie bazy danych. Powiedziawszy to, mam zamiar to zrobić za pomocą dowolnej metody, która zapewni najszybszą konwersję.

Byłbym bardzo wdzięczny za wszelką pomoc. Z góry dziękuję.

+1

Czy wiesz, który krok to proces spowalniający działanie - krok 'as.POSIXct', krok' format' lub krok 'xts'? –

+0

Jeśli szukasz fasttime (którego nie znałbyś bez odpowiedzi Dirka), znajdziesz parę podobnych Qs [LINK1] (http://stackoverflow.com/questions/12898318/convert-character-to -date-szybko-in-r), [LINK2] (http://stackoverflow.com/questions/12786335/why-is-as-date-slow-on-a-character-vector) – GSee

Odpowiedz

18

Chcesz mały i prosty pakiet fasttime firmy Simon, który robi to w najszybszy możliwy sposób - nie wywołując funkcji analizowania czasu, ale tylko za pomocą funkcji łańcuchowych na poziomie C.

Nie obsługuje tylu formatów, co strptime. W rzeczywistości nie ma nawet ciągu formatu. Ale dobrze przygotowane warianty formatu ISO, czyli yyyy-mm-dd hh:mm:ss.fff, będą działały, a twój separator / może po prostu działać.

+0

Mój boże - ja rzadko zdumiewało mnie, jak skuteczne może być rozwiązanie, ale byłem przy tym! Dziękuję bardzo. Gdzie mam wysłać ci czek? –

+2

system.time (dts <- fastPOSIXct (csv $ Date.and.Czas, "UTC")) system użytkownika upłynął 0,065 0,000 0,065 –

+0

Ogólnie pomaga wiedzieć, co się robi, a Simon naprawdę ma na to talent :) –

2

Spróbuj użyć lubridate - analizuje on cały czas za pomocą wyrażeń regularnych, dzięki czemu jest nie tylko szybszy, ale także bardziej elastyczny.