缺少某些时间时使用 strptime 格式化时间并将 AM/PM 转换为 24 小时格式
Formatting time with strptime when some times are missing and convert AM/PM to 24 hour format
我有一个像
这样的时间戳向量
time_stamp <- c("7/1/2013", "7/1/2013 12:00:30 AM", "7/1/2013 12:01:00 AM", "7/1/2013 12:01:30 AM", "8/1/2013","8/1/2013 11:02:30 PM")
我想将其格式化为 class。我试过了
strptime(time_stamp, format = "%d/%m/%Y %H:%M:%S", tz = "GMT")
但由于两个时间戳缺少时间,因此导致 NA
s,默认情况下应替换为:12:00:00.
我可以 运行 一个循环,例如:
for (i in 1:length(time_stamp))
{
if(nchar(time_stamp[i])<11)
{
time_stamp[i] <- paste(time_stamp[i], " 12:00:00 AM")
}
}
time_stamp <- format(strptime(time_stamp, format = "%d/%m/%Y %I:%M:%S %p", tz = "GMT"), "%d/%m/%Y %H:%M:%S", tz = "GMT")
是否有更快更简洁的方法来完成此操作?该向量是大型数据集的一部分,因此我不想循环遍历它。
lubridate::parse_date_time
可以接受多个令牌订单,有或没有 %
:
lubridate::parse_date_time(time_stamp, orders = c("dmy IMS p", "dmy"))
## [1] "2013-01-07 00:00:00 UTC" "2013-01-07 00:00:30 UTC" "2013-01-07 00:01:00 UTC"
## [4] "2013-01-07 00:01:30 UTC" "2013-01-08 00:00:00 UTC" "2013-01-08 23:02:30 UTC"
或使用其truncated
参数:
lubridate::parse_date_time(time_stamp, orders = 'dmy IMS p', truncated = 4)
哪个returns一样。
或者使用一些正则表达式替换,然后正常处理:
as.POSIXct(sub("(\d{4}$)", "\1 00:00:00", time_stamp),
format = "%d/%m/%Y %H:%M:%S", tz = "GMT")
#[1] "2013-01-07 00:00:00 GMT" "2013-01-07 12:00:30 GMT" "2013-01-07 12:01:00 GMT"
#[4] "2013-01-07 12:01:30 GMT" "2013-01-08 00:00:00 GMT" "2013-01-08 11:02:30 GMT"
我有一个像
这样的时间戳向量time_stamp <- c("7/1/2013", "7/1/2013 12:00:30 AM", "7/1/2013 12:01:00 AM", "7/1/2013 12:01:30 AM", "8/1/2013","8/1/2013 11:02:30 PM")
我想将其格式化为 class。我试过了
strptime(time_stamp, format = "%d/%m/%Y %H:%M:%S", tz = "GMT")
但由于两个时间戳缺少时间,因此导致 NA
s,默认情况下应替换为:12:00:00.
我可以 运行 一个循环,例如:
for (i in 1:length(time_stamp))
{
if(nchar(time_stamp[i])<11)
{
time_stamp[i] <- paste(time_stamp[i], " 12:00:00 AM")
}
}
time_stamp <- format(strptime(time_stamp, format = "%d/%m/%Y %I:%M:%S %p", tz = "GMT"), "%d/%m/%Y %H:%M:%S", tz = "GMT")
是否有更快更简洁的方法来完成此操作?该向量是大型数据集的一部分,因此我不想循环遍历它。
lubridate::parse_date_time
可以接受多个令牌订单,有或没有 %
:
lubridate::parse_date_time(time_stamp, orders = c("dmy IMS p", "dmy"))
## [1] "2013-01-07 00:00:00 UTC" "2013-01-07 00:00:30 UTC" "2013-01-07 00:01:00 UTC"
## [4] "2013-01-07 00:01:30 UTC" "2013-01-08 00:00:00 UTC" "2013-01-08 23:02:30 UTC"
或使用其truncated
参数:
lubridate::parse_date_time(time_stamp, orders = 'dmy IMS p', truncated = 4)
哪个returns一样。
或者使用一些正则表达式替换,然后正常处理:
as.POSIXct(sub("(\d{4}$)", "\1 00:00:00", time_stamp),
format = "%d/%m/%Y %H:%M:%S", tz = "GMT")
#[1] "2013-01-07 00:00:00 GMT" "2013-01-07 12:00:30 GMT" "2013-01-07 12:01:00 GMT"
#[4] "2013-01-07 12:01:30 GMT" "2013-01-08 00:00:00 GMT" "2013-01-08 11:02:30 GMT"