假设: 具有三个字符列的数据框。
Date Time Zone
1950-04-18 01:30 CST
1950-04-18 01:45 CST
1951-02-20 16:00 CST
1951-06-08 09:00 CST
1951-11-15 15:00 CST
1951-11-15 20:00 CST
必需:
1.组合日期,时间和区域
2.从字符转换为日期
我尝试了什么:
1. datetime <- paste(Date, Time)
2. strptime(datetime[1], "%Y-%m-%d %H:%M", tz=Zone[1])
这成功地解析了第一个元素,但是,我想使用lapply或sapply中的一个循环函数来转换整个数据。
如何使用循环函数解析整个向量?
注意:忘记提及,数据包含CST以外的各种缩写时区
答案 0 :(得分:3)
由于使用了不同的格式,时区可能是一个棘手的事情。要获取系统上已用时区的列表,请运行OlsonNames()
列表。
您的示例中使用的CST
时区并不总是受支持,因此在尝试将其用作时区时,您可能会收到以下警告消息:
as as.POSIXct.POSIXlt(x):未知时区'CST'
我构建了一个示例数据集(见下文),以展示如何使用时区信息更新datetime
。以下for
循环:
for (i in 1:nrow(d))
d$datetime[i] <- strftime(paste(d$Date, d$Time)[i],
format="%Y-%m-%d %H:%M",
tz = as.character(d$Zone[i]),
usetz = TRUE)
会给:
> d
Date Time Zone datetime
1 1950-04-18 01:30 GMT 1950-04-18 01:30 GMT
2 1950-04-18 01:45 CET 1950-04-18 01:45 CET
3 1951-02-20 16:00 EET 1951-02-20 16:00 EET
4 1951-06-08 09:00 EST 1951-06-08 09:00 EST
5 1951-11-15 15:00 WET 1951-11-15 15:00 WET
6 1951-11-15 20:00 MST 1951-11-15 20:00 MST
如上所述,您的数据集可能包含系统无法识别的时区缩写。例如,您可以在this list的帮助下替换它们。
使用过的数据:
d <- read.table(text="Date Time Zone
1950-04-18 01:30 GMT
1950-04-18 01:45 CET
1951-02-20 16:00 EET
1951-06-08 09:00 EST
1951-11-15 15:00 WET
1951-11-15 20:00 MST", header=TRUE, stringsAsFactors = FALSE)
答案 1 :(得分:0)
我认为这应该有效:
df1<-data.frame(x = paste(df$Date,df$Time), Zone =df$Zone)
d<-mapply(FUN = strptime,x=df1$x,tz=as.character(df1$Zone),format="%Y-%m-%d %H:%M",SIMPLIFY = F,USE.NAMES = F)