2016-01-25 11 views
1

У меня есть длинный файл csv, и я хочу импортировать некоторые данные (на основе определения colClasses) плюс его соответствующую метку времени. Я пробовал это с помощью двух разных методов, первый с моей собственной функцией (based on this answer). Вот некоторые основные вход воспроизвести результаты:Формат даты и времени импорта

setClass("myDate") 
setAs("myDate", function(from) as.Date(from, format="%d.%m.%Y %H:%M:%S")) 

data <- c("15.08.2008 00:00:00,Vienna,bla,142", "23.05.2010 01:00:00,Paris,bla,92") 
con <- textConnection(data) 

readout <- read.csv(con, colClasses=c('myDate', 'character', 'NULL', 'numeric'), header=FALSE) 
print(readout) 

Однако вывод содержит только дату, но не время (readout$V1: Date, format: "2008-08-15" "2010-05-23"):

  V1  V2 V4 
1 2008-08-15 Vienna 142 
2 2010-05-23 Paris 92 

Я попытался это также с серией zoo, но я думаю, что это не то, что я хочу, хотя этот способ содержит также время (данные индексируются соответствующей отметкой времени):

library(zoo) 
csv <- 
    "timestamp,city,foo,elev 
    15.08.2008 00:00:00,Vienna,bla,142 
    23.05.2010 01:00:00,Paris,bla,92" 
readout = read.zoo(text = csv, sep = ",", header = TRUE, index = "timestamp", format = "%d.%m.%Y %H:%M:%S", tz = "CET") 

print(readout) 

что дает:

    city foo elev 
2008-08-15 00:00:00 Vienna bla 142 
2010-05-23 01:00:00 Paris bla 92 

То, что я действительно хочу, является результатом моей собственной функции, но также содержит время, а не только дату.

+1

Почему вы используете 'as.Date', если хотите datetimes? Используйте 'as.POSIXct'. – Roland

+0

'as.Date()' возвращает дату. Вот почему ваша пользовательская функция возвращает дату, а не метку времени. 'strptime()' - это то, что вы хотите использовать. –

+0

Не работает ни с обоими ('Ошибка в матче (класс2, nm1): 'match' требует векторных аргументов') – GeoEki

ответ

1

Я немного изменил код.

data <- c("15.08.2008 00:00:00,Vienna,bla,142", "23.05.2010 01:00:00,Paris,bla,92") 
con <- textConnection(data) 


datafr <-read.csv(con,header = FALSE) 

class(datafr) 
names(datafr) 

datafr 

datafr$date <- strptime(datafr$V1,format="%d.%m.%Y %H:%M:%S") 
datafr 

Затем вы можете переименовать столбцы по своему желанию.

+0

Спасибо, это, безусловно, более легкое решение. Мой текстовый файл - несколько hundrets MB, поэтому я выделяю столбцы с избыточной информацией или данными, которые мне просто не нужны с 'colClasses' (например,' datafr <-read.csv (con, colClasses = c ('character', ' символ ',' NULL ',' numeric '), header = FALSE) ') на основе [этого чтения] (http://www.r-bloggers.com/using-colclasses-to-load-data-more-quickly -в-г /). Благодаря! – GeoEki

+0

@GeoEki Вы должны посмотреть на функцию 'fread' из package data.table. Это намного быстрее, чем 'read.csv' для больших данных. – Roland