2017-05-04 36 views
-1

每個日期如下:R:我如何轉換當天的日期+時間的數值

"dd/mm/yy Morning" 

其中,第一部分是簡單的日期,而第二部分是一天的時間,這也可以等於以下任何一項:下午,中午,午夜。

我想將每個這樣的日期轉換爲一個數字。

首先,給出基準日期,例如,

"05/05/05 Morning". 

然後,對於每個日期,我想計算此日期和基準日期之間的天數。此外,如果我們的日期有「Morning」標籤,那麼我們只需將整數值存儲爲我們的數值。但是,如果日期有「中午」標記,那麼我們將1/4加到數字中。如果是下午,我們增加2/4,如果是午夜,我們增加3/4。

因此,例如,日期

"06/05/05 Midnight", 

應轉換成1.75,

"15/05/05 Morning" 

應該僅僅是10

任何想法怎麼辦這在R?

+1

'strsplit'然後'as.Date'和'match'關鍵字這應該是相當簡單。''baseDate <-as.Date(「05/05/05」,'%d /%m /%y')'然後'a = strsplit(「06/05/05 Midnight」,split =「」) [[1]]'然後' as.integer(as.Date(a [1],'%d /%m /%y') - baseDate)+((0:3)/ 4)[match(a [2],c('Morning' ,'中午','下午','午夜'))] ' – yfyang

回答

3

使用stringr和lubridate軟件包,該函數接受指定格式的字符串「dd/mm/yy TimeOfDay」並返回日期時間對象(其中早晨=上午6點,午夜= 12點,下午= 6點,午夜=上午12點用這個來準備基準和比較新時代

library(stringr) 
library(lubridate) 

unpack <- function(s, tod_levels = c("Morning", "Noon", "Afternoon", "Midnight")) { 
    s <- str_split(s, " ")[[1]] 
    s_hr <- as.integer(factor(s[2], levels = tod_levels)) * 6 * 60 * 60 
    as_datetime(dmy(s[1])) + s_hr 
} 

例子:

baseline <- unpack("05/05/05 Morning") 

unpack("06/05/05 Midnight") - baseline 
#> Time difference of 1.75 days 

as.numeric(unpack("06/05/05 Midnight") - baseline) 
#> [1] 1.75 

as.numeric(unpack("15/05/05 Morning") - baseline) 
#> [1] 10 
相關問題