Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在大数据帧中快速转换不同的时间格式?_R_Performance_Datetime Format - Fatal编程技术网

R 如何在大数据帧中快速转换不同的时间格式?

R 如何在大数据帧中快速转换不同的时间格式?,r,performance,datetime-format,R,Performance,Datetime Format,我想在不同的时间维度中计算长度,但在数据帧列中处理两种稍微不同的时间格式时遇到问题 原始数据帧列大约有一百万行,这两种格式(如示例代码所示)混合在一起 示例代码: time <- c("2018-07-29T15:02:05Z", "2018-07-29T14:46:57Z", "2018-10-04T12:13:41.333Z", "2018-10-04T12:13:45.479Z") length <- c(15.8, 132.1, 12.5, 33.2)

我想在不同的时间维度中计算长度,但在数据帧列中处理两种稍微不同的时间格式时遇到问题

原始数据帧列大约有一百万行,这两种格式(如示例代码所示)混合在一起

示例代码:

time <- c("2018-07-29T15:02:05Z", "2018-07-29T14:46:57Z",
         "2018-10-04T12:13:41.333Z", "2018-10-04T12:13:45.479Z")

length <- c(15.8, 132.1, 12.5, 33.2)

df <- data.frame(time, length)

df$time <- format(as.POSIXlt(strptime(df$time,"%Y-%m-%dT%H:%M:%SZ", tz="")))
df

time您可以随时使用库

    library(anytime)
    time<- c("2018-07-29T15:02:05Z",
             "2018-07-29T14:46:57Z",
             "2018-10-04T12:13:41.333Z",
             "2018-10-04T12:13:45.479Z")
    anytime(time)
#[1] "2018-07-29 15:02:05 CEST" "2018-07-29 14:46:57 CEST" "2018-10-04 12:13:41 CEST" "2018-10-04 12:13:45 CEST"
库(任何时候)
时间或您也可以使用:

time<- c("2018-07-29T15:02:05Z",
         "2018-07-29T14:46:57Z",
         "2018-10-04T12:13:41.333Z",
         "2018-10-04T12:13:45.479Z")

length<-c(15.8,132.1,12.5,33.2)

df<-data.frame(time,length)
library(lubridate)

# df$time2<-as_datetime(df$time)
df$time2 <-parse_date_time(df$time, "ymd_HMS") 
df

time我们可以使用
%OS
而不是
%S
来计算以秒为单位的小数

help("strptime")
特定于R的是
%OSn
,对于输出,它将秒数截断为
0在base R中,您可以使用
gsub(\\..*Z”,“Z”,time)删除点后的值。
谢谢您-不幸的是,我的大数据集需要很长时间才能应用此命令哇,这真令人沮丧-我在这方面花了相当多的时间,现在您告诉我还有一封我丢失的信,谢谢@小姐,不客气。它隐藏在
?strtime
“Value”部分前倒数第二段的文档中。很抱歉再次打扰您,但我在数据框列中遇到了另一种日期格式。有些行的日期如下
2018-09-01T12:42:37.000+02:00
。是否可以将其也包含在
as.POSIXct()
中?@Lasse请参阅更新,我希望这是您想要的。您可以使用
if(nchar(x)==29)将其封装在函数中。。。else
结构。非常好的解决方案!非常感谢你的努力!
as.POSIXct(time, format="%Y-%m-%dT%H:%M:%OSZ")
# [1] "2018-07-29 15:02:05 CEST" "2018-07-29 14:46:57 CEST"
# [3] "2018-10-04 12:13:41 CEST" "2018-10-04 12:13:45 CEST"
time2 <- c("2018-09-01T12:42:37.000+02:00", "2018-10-01T11:42:37.000+03:00")
as.POSIXct(substr(time2, 1, 23), format="%Y-%m-%dT%H:%M:%OS") + 
  {os <- as.numeric(el(strsplit(substring(time2, 24), "\\:")))
  (os[1]*60 + os[2])*60}
# [1] "2018-09-01 14:42:37 CEST" "2018-10-01 13:42:37 CEST"
as.POSIXct(substr(time2, 1, 23), format="%Y-%m-%dT%H:%M:%OS") + 
  as.numeric(substr(time2, 24, 26))*3600
# [1] "2018-09-01 14:42:37 CEST" "2018-10-01 13:42:37 CEST"
fixDateTime <- function(x) {
  s <- split(x, nchar(x))
  if ("20" %in% names(s))
    s$`20` <- as.POSIXct(s$`20` , format="%Y-%m-%dT%H:%M:%SZ")
  else if ("24" %in% names(s))
    s$`24` <- as.POSIXct(s$`24`, format="%Y-%m-%dT%H:%M:%OSZ")
  else if ("29" %in% names(s))
    s$`29` <- as.POSIXct(substr(s$`29`, 1, 23), format="%Y-%m-%dT%H:%M:%OS") + 
      {os <- as.numeric(el(strsplit(substring(s[[3]], 24), "\\:")))
      (os[1]*60 + os[2])*60}
  return(unsplit(s, nchar(x)))
}

res <- fixDateTime(time3)
res
# [1] "2018-07-29 15:02:05 CEST" "2018-10-04 00:00:00 CEST" "2018-10-01 00:00:00 CEST"
str(res)
# POSIXct[1:3], format: "2018-07-29 15:02:05" "2018-10-04 00:00:00" "2018-10-01 00:00:00"
# Unit: milliseconds
#        expr       min        lq      mean    median        uq       max neval  cld
# fixDateTime  35.46387  35.94761  40.07578  36.05923  39.54706  68.46211    10   c 
#  as.POSIXct  20.32820  20.45985  21.00461  20.62237  21.16019  23.56434    10  b   # to compare
#   lubridate  11.59311  11.68956  12.88880  12.01077  13.76151  16.54479    10 a    # produces NAs! 
#     anytime 198.57292 201.06483 203.95131 202.91368 203.62130 212.83272    10    d # produces NAs!
time <- c("2018-07-29T15:02:05Z", "2018-07-29T14:46:57Z", "2018-10-04T12:13:41.333Z", 
"2018-10-04T12:13:45.479Z")
time2 <- c("2018-07-29T15:02:05Z", "2018-07-29T15:02:05Z", "2018-07-29T15:02:05Z") 
time3 <- c("2018-07-29T15:02:05Z", "2018-10-04T12:13:41.333Z", 
           "2018-10-01T11:42:37.000+03:00") 
n <-  1e3
t1 <- sample(time2, n, replace=TRUE)
t2 <- sample(time3, n, replace=TRUE)

library(lubridate)
library(anytime)
microbenchmark::microbenchmark(fixDateTime=fixDateTime(t2),
                               as.POSIXct=as.POSIXct(t1, format="%Y-%m-%dT%H:%M:%OSZ"),
                               lubridate=parse_date_time(t2, "ymd_HMS"),
                               anytime=anytime(t2),
                               times=10L)