代码之家  ›  专栏  ›  技术社区  ›  Om Sao

R:更改数据框中的所有日期格式

  •  0
  • Om Sao  · 技术社区  · 6 年前

    我对R编程非常陌生,有点陷入了这样的境地: 我有一个数据框,我想检查任何行/列中是否有日期格式的值,应该剥离为仅时间部分。 例如,日期字符串 "2015-01-02 10:15:44" 应改为 "10:15:44"

    我知道,这是一种非常新手的方法,但以下是我尝试使用的所有值的子字符串。

    id<-c(1,2,3,4)
    time1<-c("2015-01-02 10:15:44","NA","2015-11-12 00:15:44","2015-01-02 12:15:14")
    time2<-c("NA", "2015-01-02 10:15:44","NA","2015-11-12 00:15:44")
    ..
    ..
    timen ....
    print(df)
    
    df<-data.frame(id,time1, time2,..., timen)
    df[1:4 ,2: ncol(df)] <- substring(df[1:4 ,2: ncol(df)], 12)
    print(df)
    

    有人能建议一条出路吗?

    0 回复  |  直到 6 年前
        1
  •  2
  •   DS_UNI    6 年前

    你试过这个包裹吗 lubridate :

    time_cols <- c("time1", "time2")
    
    df[time_cols] <- apply(df[time_cols], 2, 
                           function(col){
                              format(lubridate::ymd_hms(col), "%H:%M:%S")
                           })
    df
    #     id    time1    time2
    #   1  1 10:15:44     <NA>
    #   2  2     <NA> 10:15:44
    #   3  3 00:15:44     <NA>
    #   4  4 12:15:14 00:15:44
    
        2
  •  1
  •   zx8754    6 年前

    循环遍历列和 子串 :

    df[, 2:3] <- lapply(df[, 2:3], substring, first = 12)
    df
    #   id    time1    time2
    # 1  1 10:15:44         
    # 2  2          10:15:44
    # 3  3 00:15:44         
    # 4  4 12:15:14 00:15:44  
    
    # input data
    df <- data.frame(id = c(1,2,3,4),
                     time1 = c("2015-01-02 10:15:44","NA","2015-11-12 00:15:44","2015-01-02 12:15:14"),
                     time2 = c("NA", "2015-01-02 10:15:44","NA","2015-11-12 00:15:44"))
    
        3
  •  1
  •   NelsonGon phoxis    6 年前

    试试这个: df1 包含您的数据。您可以在此操作后与原始数据重新组合。

        target<-unlist(sapply(stringr::str_extract_all(names(df1),"^t.*"),"["))
           Changed<-as.data.frame(sapply(target,function(x){ind=which(names(df1)==x)
           unlist(sapply(stringr::str_split(df1[,ind]," "),"[",2))}))
    cbind(id=df1$id,Changed)
    

    输出:

           id    time1    time2
           1    10:15:44     <NA>
           2     <NA>      10:15:44
           3   00:15:44       <NA>
           4    12:15:14 00:15:44