首页 文章

在R中更改日期时间格式

提问于
浏览
1

我有一个包含两列“start”和“end”的表,其中包含相应开始和结束时段的日期和时间,如下所示:

Sr. No.    Start                 End
1          22May2001:00:00:00    27May2001:23:59:59
2          28May2001:00:00:00    26Jun2001:23:59:59

我想按以下格式转换上述日期时间(带时间戳的ISO8601):

Sr. No.    Start                 End
1          2001-05-22 00:00:00   2001-05-27 23:59:59
2          2001-05-28 00:00:00   2001-06-26 23:59:59

我使用了此链接提供的代码:http://www.stat.berkeley.edu/~s133/dates.html

View(my_table)
str(my_table)
my_table$startD <- as.Date(my_table$start, "%d%b%Y:%H:%M:%S")
my_table$startT <- strptime(my_table$start, format = "%d%b%Y:%H:%M:%S")

到目前为止,我的尝试给了我两个这样的列:

StartD       StartT
2001-05-22   2001-05-22

这是不可取的 . 有人可以建议我通过上面或任何替代方法转换所需格式的日期时间吗?

2 回答

  • 1

    为了清楚起见,在答案形式中,您需要一个datetime类,在R中表示POSIXct或POSIXlt . 通常我们使用 as.POSIXctstrptime 分别将字符串解析到每个类中( as.POSIXlt 存在,但很少使用),尽管如果你愿意,还有一些替代品 .

    最基本的,

    my_table$Start <- as.POSIXct(my_table$Start, format = '%d%b%Y:%H:%M:%S')
    my_table$End <- as.POSIXct(my_table$End, format = '%d%b%Y:%H:%M:%S')
    
    my_table
    ##   Sr.No.      Start                 End
    ## 1      1 2001-05-22 2001-05-27 23:59:59
    ## 2      2 2001-05-28 2001-06-26 23:59:59
    

    请注意,您需要指定 format 字符串的名称,因为 as.POSIXct 的第二个参数实际上是 tz (用于设置时区) . 另请注意,虽然 Start 看起来像是's missing a time, that',因为POSIX * t的打印方法不会在午夜打印时间,但它们仍然存储 .

    如果您想在一行中更改两者,则可以使用

    my_table[-1] <- lapply(my_table[,-1], as.POSIXct, format = '%d%b%Y:%H:%M:%S')
    

    或者在dplyr中(比POSIXlt更喜欢POSIXct):

    library(dplyr)
    
    my_table %>% mutate_at(-1, as.POSIXct, format = '%d%b%Y:%H:%M:%S')
    

    两者都返回完全相同的东西 . 你也可以使用lubridate::dmy_hms, which parses to POSIXct

    library(lubridate)
    
    my_table$Start <- dmy_hms(my_table$Start)    # or lapply like above
    my_table$End <- dmy_hms(my_table$End)
    
    # or dplyr
    my_table %>% mutate_at(-1, dmy_hms)
    

    这也回归同样的事情 .


    数据

    my_table <- structure(list(Sr.No. = 1:2, Start = structure(1:2, .Label = c("22May2001:00:00:00", 
        "28May2001:00:00:00"), class = "factor"), End = structure(c(2L, 
        1L), .Label = c("26Jun2001:23:59:59", "27May2001:23:59:59"), class = "factor")), .Names = c("Sr.No.", 
        "Start", "End"), class = "data.frame", row.names = c(NA, -2L))
    
  • 1

    希望这可以帮助 .

    my_table <- "22May2001:22:02:50"
    
    my_table <- strptime(as.character(my_table), "%d%b%Y:%H:%M:%S")
    
    my_table <- format(my_table, "%Y-%m-%d %H:%M:%S")
    
    str(my_table)
    

相关问题