在R中更改日期时间格式

5

我有一张表格,包含两列"开始"和"结束",分别包含相应的开始和结束时间和日期,如下:

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 %>% mutate_at(-1, as.POSIXct, format = '%d%b%Y:%H:%M:%S')或等效的方法。请注意,午夜时分的打印会省略时间部分,但仍然存储在其中。 - alistaire
as.Date仅转换日期而不是时间。尝试:my_table$startD <- as.POSIXct(my_table$start,"%d%b%Y:%H:%M:%S") - Dave2e
@Dave2e:当我尝试使用"as.POSIXct()"时,遇到了一个错误:Error in as.POSIXlt.character(as.character(x), ...) : character string is not in a standard unambiguous format。无论如何,感谢您的帮助。 - khajlk
你需要指定参数名:format =“%d%b%Y:%H:%M:%S”,因为否则它会认为解析字符串是第二个参数,用于设置时区。 - alistaire
2个回答

3
为了更清晰地回答,您需要一个日期时间类,而在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

请注意,在调用as.POSIXct函数时,需要在第二个参数中指定format字符串的名称,而不是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,它将解析为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)

4
将日期时间保留为 POSIX*t 格式比使用 format 函数转换为字符格式更加有用。 - alistaire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接