我有一个包含两列“开始”和“结束”的表格,其中包含相应开始和结束期间的日期和时间,如下所示:
Sr. No. Start End
1 22May2001:00:00:00 27May2001:23:59:59
2 28May2001:00:00:00 26Jun2001:23:59:59
Run Code Online (Sandbox Code Playgroud)
我想将上面的日期时间转换为以下格式(带时间戳的 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
Run Code Online (Sandbox Code Playgroud)
我已使用此链接中提供的代码: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")
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的尝试给了我这样的两列:
StartD StartT
2001-05-22 2001-05-22
Run Code Online (Sandbox Code Playgroud)
这是不可取的。有人可以建议我通过上述或任何替代方法将日期时间转换为所需的格式吗?
为了清楚起见,在答案形式中,您需要一个日期时间类,在 R 中意味着 POSIXct 或 POSIXlt。通常我们使用as.POSIXct和strptime分别将字符串解析到每个类中(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
Run Code Online (Sandbox Code Playgroud)
请注意,您需要指定字符串的名称format,因为 的第二个参数as.POSIXct实际上是tz(用于设置时区)。另请注意,虽然Start看起来缺少时间,但这是因为 POSIX*t 的打印方法不会在午夜打印时间,尽管它们仍然被存储。
如果您想在一行中更改两者,您可以使用
my_table[-1] <- lapply(my_table[,-1], as.POSIXct, format = '%d%b%Y:%H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
或者在 dplyr 中(与 POSIXlt 相比,它更喜欢 POSIXct):
library(dplyr)
my_table %>% mutate_at(-1, as.POSIXct, format = '%d%b%Y:%H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
两者都返回完全相同的东西。您还可以使用lubridate::dmy_hms,它解析为 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)
Run Code Online (Sandbox Code Playgroud)
这也返回相同的东西。
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))
Run Code Online (Sandbox Code Playgroud)