“as.ITime”函数是否有保留百分之一秒的方法?

huangapple go评论80阅读模式
英文:

Is there any way of preserving the hundredths of seconds with the function "as.ITime" of data.table?

问题

我想将一个类为 "data.table" 的表格中的一列(例如:"01:22:03.56")从字符格式转换为日期格式,使用[data.table]函数 "as.ITime",但在转换后失去了百分之一秒。是否有办法在[data.table]中保留百分之一秒?

英文:

I'd like to transform a column of a table of class "data.table" which is in characters ("01:22:03.56" for example) into date format with the [data.table] function "as.ITime", but I lose the hundredths of seconds after conversion (01:22:03). Is there any way of preserving the hundredths of seconds with [data.table]?

答案1

得分: 0

前言:ITime 的设计是将时间存储为整数。从 ?as.ITime

描述:

     带有整数存储的日期和时间类,用于快速排序和分组。仍然处于实验阶段!

这意味着使用 as.ITime 没有直接存储毫秒的方式。

选择最佳选项取决于您后续处理的要求。

  1. 使用 lubridate::hms,它创建一个 "Period" 类的对象。

    tm <- lubridate::hms("01:22:03.56")
    tm + 5
    # [1] "1H 22M 8.56S"
    ### 这看起来有点奇怪...
    tm - 5
    # [1] "1H 22M -1.44S"
    ### ... 但最终可以解决
    (tm + 5) - (tm - 5)
    # [1] "10S"
    
  2. 选择一个日期(任意日期),并将其前置到时间,然后使用 as.POSIXct

    tm <- as.POSIXct(paste("1970-01-01", "01:22:03.56"))
    tm
    # [1] "1970-01-01 01:22:03 EST"
    ### 为了证明毫秒在其中,您可以使用以下方式之一
    dput(tm)
    # structure(22923.56, class = c("POSIXct", "POSIXt"), tzone = "")
    ### 或者您可以设置在控制台上的显示方式
    options(digits.secs=3)
    tm
    # [1] "1970-01-01 01:22:03.56 EST"
    tm + 5
    # [1] "1970-01-01 01:22:08.56 EST"
    tm - 5
    # [1] "1970-01-01 01:21:58.56 EST"
    
  3. 如果您只需要该时间的数字解释,那么

    time2num <- function(x) {
      vapply(strsplit(x, ':'), function(y) sum(as.numeric(y) * c(60*60, 60, 1)),
             numeric(1), USE.NAMES=FALSE)
    }
    tm <- time2num("01:22:03.56")
    tm
    # [1] 4923.56
    
英文:

Up front: ITime by-design stores as an integer. From ?as.ITime:

Description:

     Date and time classes with integer storage for fast sorting and
     grouping. Still experimental!

This means there is no direct way of storing the time with milliseconds using as.ITime.

Options, which is best depends heavily on what your follow-on processing requires.

  1. Use lubridate::hms, which creates an object of class "Period".

    tm <- lubridate::hms("01:22:03.56")
    tm + 5
    # [1] "1H 22M 8.56S"
    ### this will look odd ...
    tm - 5
    # [1] "1H 22M -1.44S"
    ### ... but it works out in the end
    (tm + 5) - (tm - 5)
    # [1] "10S"
    
  2. Pick a date (arbitrary) and prepend it to the time, then use as.POSIXct:

    tm <- as.POSIXct(paste("1970-01-01", "01:22:03.56"))
    tm
    # [1] "1970-01-01 01:22:03 EST"
    ### to prove that milliseconds are in there, you can either
    dput(tm)
    # structure(22923.56, class = c("POSIXct", "POSIXt"), tzone = "")
    ### or you can set how it is rendered on the console
    options(digits.secs=3)
    tm
    # [1] "1970-01-01 01:22:03.56 EST"
    tm + 5
    # [1] "1970-01-01 01:22:08.56 EST"
    tm - 5
    # [1] "1970-01-01 01:21:58.56 EST"
    
  3. If all you need is a numeric interpretation of that time, then

    time2num <- function(x) {
      vapply(strsplit(x, ':'), function(y) sum(as.numeric(y) * c(60*60, 60, 1)),
             numeric(1), USE.NAMES=FALSE)
    }
    tm <- time2num("01:22:03.56")
    tm
    # [1] 4923.56
    

huangapple
  • 本文由 发表于 2023年6月29日 16:29:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/76579318.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定