R

时间:2016-07-29 22:30:15

标签: r date datetime posix

我有一个时间戳列,我将其转换为POSIXct。问题是同一列中有两种不同的格式,所以如果我使用更常见的转换,另一种转换为NA。

MC$Date    
12/1/15 22:00    
12/1/15 23:00    
12/2/15    
12/2/15 1:00    
12/2/15 2:00

我使用以下代码转换为POSIXct:

MC$Date <- as.POSIXct(MC$Date, tz='MST', format = '%m/%d/%Y %H:%M')

结果:

MC$Date    
15-12-01 22:00:00    
15-12-01 23:00:00    
NA    
15-12-02 01:00:00    
15-12-02 02:00:00

我尝试使用逻辑向量来识别问题,然后纠正它,但无法找到一个简单的解决方案。

3 个答案:

答案 0 :(得分:4)

lubridate包旨在处理这种情况。

dt <- c(
"12/1/15 22:00",
"12/1/15 23:00", 
"12/2/15",
"12/2/15 1:00",
"12/2/15 2:00"
)
dt
[1] "12/1/15 22:00" "12/1/15 23:00" "12/2/15"       "12/2/15 1:00"  "12/2/15 2:00" 
lubridate::mdy_hm(dt, truncated = 2)
[1] "2015-12-01 22:00:00 UTC" "2015-12-01 23:00:00 UTC" "2015-12-02 00:00:00 UTC"
[4] "2015-12-02 01:00:00 UTC" "2015-12-02 02:00:00 UTC"

truncated参数表示可以丢失多少格式。

如果tz不合适,您可以添加UTC参数来指定要解析日期的时区。

答案 1 :(得分:0)

我认为逻辑矢量方法可行。也许与一个临时向量串联,用于保存已解析的日期而不会破坏未解析的日期。像这样:

dates <- as.POSIXct(MC$Date, tz='MST', format = '%m/%d/%Y %H:%M')
dates[is.na(dates)] <- as.POSIXct(MC[is.na(dates),], tz='MST', format = '%m/%d/%Y')
MC$Date <- dates

答案 2 :(得分:0)

由于所有日期时间都以日期和时间之间的空格分隔,因此您可以使用strsplit仅提取日期部分。

extractDate <- function(x){ strsplit(x, split = " " )[[1]][1] }
MC$Date <- sapply( MC$Date, extractDate )

然后按照你喜欢的方式进行转换,而不必担心时间部分会妨碍你。