2015-06-02 179 views
1

我有一個包含非結構化日期信息的字段的數據集。我試圖將其轉換爲日期,但該字段有兩種形式的日期,一種是am/pm和一種24小時制時鐘。if/ifelse問題

如果我嘗試直接轉換它,它會中斷並顯然給出不正確的答案。

因此,在做了一些檢查之後,我開始了一個簡單的if函數。與AM/PM字段之間的主要區分器是字段的長度,所以我嘗試了以下內容:

dateCheck <- function(x) { 
if(nchar(x) > 17) { 
strptime(x,"%m/%d/%Y %I:%M %p") 
} else { 
strptime(x,"%m/%d/%Y %H:%M") 
} 
} 

這wasnt工作,並返回以下錯誤:

the condition has length > 1 and only the first element will be used

經過一番研究,我看到有一些問題,如果使用的功能,我也許應該使用ifelse,並提出了以下幾點:

ifelse(nchar(x) > 17,strptime(x,"%m/%d/%Y %I:%M %p"),strptime(x,"%m/%d/%Y %H:%M")) 

這確實與我的數據幀食堂,給我絕對垃圾讀數。 它最近也開始給我下面的錯誤:

Warning messages: 1: In ifelse(nchar(fb2$Date) > 17, strptime(fb2$Date, "%m/%d/%Y %I:%M %p"), : number of items to replace is not a multiple of replacement length 2: In ifelse(nchar(fb2$Date) > 17, strptime(fb2$Date, "%m/%d/%Y %I:%M %p"), : number of items to replace is not a multiple of replacement length

任何想法,我應該怎麼辦?

編輯:樣本數據

The type with the AM/PM 
04/20/2015 3:47 pm 
04/20/2015 3:32 pm 
04/19/2015 12:45 pm 
04/18/2015 9:00 pm 
04/16/2015 2:52 pm 
04/14/2015 4:40 pm 
04/14/2015 10:48 am 
04/14/2015 10:28 am 

The type without 
04/11/2015 11:28 
04/10/2015 16:12 
04/09/2015 16:44 
04/08/2015 12:12 
04/08/2015 11:38 
04/07/2015 12:11 
04/05/2015 08:45 

這意味着數據的一個例子在一起會是什麼樣子

04/16/2015 2:52 pm 
04/14/2015 4:40 pm 
04/14/2015 10:48 am 
04/14/2015 10:28 am 
04/11/2015 11:28 
04/10/2015 16:12 
04/09/2015 16:44 
04/03/2015 08:57 
04/02/2015 17:41 
04/01/2015 11:44 
03/28/2015 12:45 pm 
03/28/2015 10:59 am 
03/27/2015 4:13 pm 
03/23/2015 5:02 pm 
03/22/2015 4:06 pm 
03/22/2015 1:10 pm 
03/21/2015 8:20 am 
03/19/2015 10:12 am 
03/18/2015 1:41 pm 
03/17/2015 1:41 pm 
03/13/2015 4:03 pm 
03/12/2015 15:19 
03/12/2015 11:05 
03/11/2015 16:12 
03/11/2015 09:46 
03/08/2015 19:29 
+0

你能提供一些樣本數據嗎?另外,在你的'ifelse'語句中,第一個'strptime'包含'/%d#',第二個包含'/%d'。你有意這麼做嗎? –

+0

'sapply(original_vector,dateCheck)'應該可以工作,但'ifelse'應該也有。正如約翰所說,我們需要數據。 – hrbrmstr

+0

示例數據爲:「04/14/2015 10:28 am」爲一種類型,「04/11/2015 11:28:00」爲另一種 – Meeckah

回答

0
raw.vector <- c("04/16/2015 2:52 pm", "04/14/2015 4:40 pm", "04/14/2015 10:48 am" 
        , "04/11/2015 11:28", "04/10/2015 16:12") 

mod.vector <- strptime(raw.vector,"%m/%d/%Y %I:%M %p") 
ind <- is.na(mod.vector) 
mod.vector[ind] <- strptime(raw.vector[ind],"%m/%d/%Y %H:%M") 

它應該作品沒有任何警告。 但是不知道什麼產品的警告。

+0

非常感謝!這工作完美。歡呼的幫助 - 應該考慮周圍的工作,但仍然想知道爲什麼我的ifelse沒有工作。如果我可以但是沒有足夠的代表,我會贊成! – Meeckah