首页 文章

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

提问于
浏览
1

Given: 具有三个字符列的数据框 .

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

Required:
1.结合日期,时间和区域
2.从字符转换为日期

What I have tried:

  1. datetime <- paste(Date, Time)
  2. strptime(datetime[1], "%Y-%m-%d %H:%M", tz=Zone[1])

这成功地解析了第一个元素,但是,我想使用lapply或sapply中的一个循环函数来转换整个数据 .

如何使用循环函数来解析整个向量?

NOTE: 忘了前面提到,数据包含CST以外的各种缩写时区

2 回答

  • 3

    由于使用了不同的格式,时区可能是一个棘手的事情 . 要获取系统上已用时区的列表,请运行 OlsonNames() 作为列表 .

    您的示例中使用的 CST 时区并不总是受支持,因此在尝试将其用作时区时可能会收到以下警告消息:

    在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)
    
  • 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)
    

相关问题