2017-02-17 59 views
-4

所以,data是一個數據幀由許多列,而其中一個叫lpep_pickup_datetime有日期和時間在「2016年1月1日上午12時39分36秒」如何有效地遍歷數據框的列?

的格式,我想分析這些數據按日期和時間,所以我試圖創建一個名爲pickup_date的新列和一個名爲pickup_time的AM或PM信息。

我已經使用strsplit函數將字符串拆分爲以下形式:c(「01/01/2016」,「12:29:24」,「AM」),並且我正在嘗試創建上述列出這些數據。

我已經寫了下面的代碼:

data$lpep_pickup_datetime=strsplit(data$lpep_pickup_datetime, " ") 

data$pickup_date=data$lpep_pickup_datetime[[1]][1] 


for (i in seq(1,90181)) 
{ 
    data$pickup_time[i]=data$lpep_pickup_datetime[[i]][2] 
} 

這是嚴重低效的,因爲它需要太長時間通過90181行數據進行迭代。有沒有更好的方法來完成這項任務?

謝謝。

+0

請顯示一個小的可重複的例子和預期的輸出? – akrun

+0

從'dplyr'包簽出'separate()'和'unite()'。 – Aramis7d

+1

將日期時間解析爲像POSIXct這樣的日期時間類會更有用,在此之後,如果真的需要,可以提取部分。 – alistaire

回答

1

?apply(df, 2, function(...))是通過迭代列的常用方法。但你不需要在這裏做

> df<-data.frame("datetime" = format(seq(c(ISOdate(2000,3,20)), by = "day", length.out = 100000), "%Y-%m-%d %r"), stringsAsFactors=FALSE) 
> str(df) 
'data.frame': 100000 obs. of 1 variable: 
$ datetime: chr "2000-03-20 08:00:00 PM" "2000-03-21 08:00:00 PM" "2000-03-22 08:00:00 PM" "2000-03-23 08:00:00 PM" ... 
> df$dateonly<-format(as.Date(df$datetime, format="%Y-%m-%d %r"),"%Y-%m-%d") 
> head(df) 
       datetime dateonly 
1 2000-03-20 08:00:00 PM 2000-03-20 
2 2000-03-21 08:00:00 PM 2000-03-21 
3 2000-03-22 08:00:00 PM 2000-03-22 
4 2000-03-23 08:00:00 PM 2000-03-23 
5 2000-03-24 08:00:00 PM 2000-03-24 
6 2000-03-25 08:00:00 PM 2000-03-25 
+0

因爲我的格式是'01/01/2016 12:39:36 AM'的形式,所以我將你的代碼修改爲'data $ pickup _date <-format(as .Date(data $ lpep_pickup_datetime,format =「%m-%d-%y%r」),「%m-%d-%y」),但結果是一堆NA。 – user101998

+0

你很粗心。你的格式是'%m /%d /%Y%r'。 – Jean

1

base R,我們可以使用sub創建一個分隔符,然後用read.csv創建兩列

data[paste0("pickup_", c("date", "time"))] <- read.csv(text=sub("\\s+", 
     ",", data$lpep_pickup_datetime), header=FALSE, stringsAsFactors=FALSE) 
+0

我認爲paste0有一個不匹配的括號。另外,它給了我這個錯誤信息:「[.data.table'(x,i,which = TRUE)中的錯誤: 當我是data.table(或字符矢量)時,要加入的列必須可以使用'on ='參數(請參閱?data.table)或通過鍵入x(即排序,並標記爲排序,請參閱setkey)來指定鍵控連接可能會對超大數據帶來進一步的速度優勢,因爲x在RAM中排序「。 – user101998

+0

@ user101998是的,你是對的。忘記了')'..修正了它。如果你的數據集是'data.table',語法不同 – akrun