我有一个时间戳列,我将其转换为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
我尝试使用逻辑向量来识别问题,然后纠正它,但无法找到一个简单的解决方案。
答案 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 )
然后按照你喜欢的方式进行转换,而不必担心时间部分会妨碍你。