使用循环函数将字符转换为带时区的日期

时间:2016-03-07 07:45:41

标签: r lapply sapply strptime

假设: 具有三个字符列的数据框。

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以外的各种缩写时区

2 个答案:

答案 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)