【问题标题】:Changing date time format in R在 R 中更改日期时间格式
【发布时间】:2016-07-26 15:33:20
【问题描述】:

我有一个表格,其中包含“开始”和“结束”两列,其中包含各自开始和结束期间的日期和时间,如下所示:

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

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

【问题讨论】:

  • 您需要一个日期时间类(即 POSIXct 或 POSIXlt)。您可以使用as.POSIXctstrptime 进行解析,例如library(dplyr) ; df %&gt;% mutate_at(-1, as.POSIXct, format = '%d%b%Y:%H:%M:%S') 或等效项。请注意,在午夜打印两者都省略了时间部分,但它仍然被存储。
  • as.Date 只转换日期而不是时间。试试: my_table$startD
  • @Dave2e:当我尝试使用“as.POSIXct()”时。我遇到了一个错误: as.POSIXlt.character(as.character(x), ...) 中的错误:字符串不是标准的明确格式,。无论如何感谢您的帮助。
  • 你需要指定参数名:format = "%d%b%Y:%H:%M:%S",否则会假定解析字符串是第二个参数,用于设置时区。

标签: r


【解决方案1】:

为了清楚起见,在答案形式中,您需要一个日期时间类,它在 R 中表示 POSIXct 或 POSIXlt。通常我们使用as.POSIXctstrptime 分别将字符串解析到每个类中(as.POSIXlt 存在,但很少使用),但如果您愿意,也可以使用 lubridate 替代方案。

最基本的,

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 看起来缺少时间,但这是因为 POSIX*t 的打印方法不会在午夜打印时间,尽管它们仍被存储。

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

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

或在 dplyr 中(它更喜欢 POSIXct 而不是 POSIXlt):

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

【讨论】:

    【解决方案2】:

    希望这会有所帮助。

    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)
    

    【讨论】:

    • 将日期时间保留为 POSIX*t 比使用 format 转换回字符更有用。
    猜你喜欢
    • 2015-03-03
    • 2011-11-18
    • 1970-01-01
    • 2016-05-28
    • 2015-08-20
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多