代码之家  ›  专栏  ›  技术社区  ›  JoeM05

excel中缺少格式的持续时间在R中表现得很奇怪

  •  0
  • JoeM05  · 技术社区  · 8 年前

    我有excel电子表格中的数据,我用 XLConnect .

    R将它显示为一个奇怪的日期。

    以下是我的数据示例:

    2:21
    6:08
    0:39
    13:51
    

    下面是R是如何解释的:

    "1899-12-31 02:21:00"
    "1899-12-31 06:08:00"
    "1899-12-31 00:39:00"
    "1899-12-31 13:51:00"
    

    我怎么能把它解释成m:ss的持续时间呢?

    2 回复  |  直到 8 年前
        1
  •  1
  •   s__    8 年前

    关于:
    如果要将它们作为时间来处理,可以尝试以下方法:

    u <- c('2:21','6:08','0:39','13:51')
    strptime(u,'%M:%S')
    [1] "2018-08-30 00:02:21 CEST" "2018-08-30 00:06:08 CEST" "2018-08-30 00:00:39 CEST" "2018-08-30 00:13:51 CEST"
    

    所以你也可以做代数和这样的运算:

    strptime(u,'%M:%S')-strptime(u[2],'%M:%S')
    Time differences in secs
    [1] -227    0 -329  463
    

    substr(strptime(u,'%M:%S'),15,19)
    [1] "02:21" "06:08" "00:39" "13:51"
    

    或:

    format(strptime(u,'%M:%S'), '%M:%S')
    [1] "02:21" "06:08" "00:39" "13:51"
    

    最后,如果您只希望分钟的小数点存在,可以尝试以下方法:

    ifelse(
    substr(strptime(u,'%M:%S'),15,15)==0,
        substr(strptime(u,'%M:%S'),16,19),
        substr(strptime(u,'%M:%S'),15,19))
     [1] "2:21"  "6:08"  "0:39"  "13:51"
    

    编辑

    如果您想要60倍的比例,那么选项一适用于绘图:

     u <- c('2:21','6:08','0:39','13:51')
        strptime(u,'%M:%S')
        [1] "2018-08-30 00:02:21 CEST" "2018-08-30 00:06:08 CEST" "2018-08-30 00:00:39 CEST" "2018-08-30 00:13:51 CEST"
    plot(x=c(1,2,3,4),strptime(u,'%M:%S'))
    

    如果您喜欢十进制小数,可以将其转换为:

    sapply(strsplit(u,":"),
      function(x) {
        x <- as.numeric(x)
        x[1]+x[2]/60
        })
    
    [1]  2.350000  6.133333  0.650000 13.850000
    
        2
  •  0
  •   JoeM05    8 年前

    我不太清楚到底发生了什么,但R把日期解释成字符串。当我试图将它们转换为日期时,我收到一个错误:

    > typeof(as.POSIXct(td$Time.on.Task))
    Error in as.POSIXlt.character(x, tz, ...) : 
      character string is not in a standard unambiguous format
    

    我意识到我有字符串,所以我在他的回答中使用了@t\s强调的一些技巧(非常感谢!)。

    第一步是像字符串一样将时间位与日期的其余部分分离。

    times <- substr(td$Time.on.Task, 12,16)
    [1] "02:21" "06:08" "00:39" "13:51"
    

    接下来,我使用apply函数和一些简单的数学将它们转换成十进制数,以分钟为单位。

    td$Minutes <- sapply(strsplit(times,":"),
                    function(x) {
                      x <- as.numeric(x)
                      x[1]+x[2]/60
                    })
    [1] 2.35  6.13  0.65 13.85
    

    我有我需要的继续工作。