Rounding milliseconds of POSIXct in data.table v1.9.2 (ok in 1.8.10)

后端 未结 1 1524
有刺的猬
有刺的猬 2021-02-08 23:14

I have a weird result for my data.table v1.9.2 :

DT
                 timestamp
1: 2013-01-01 17:51:00.707
2: 2013-01-01 17:51:59.996
3: 2013-01-01 1         


        
1条回答
  •  伪装坚强ぢ
    2021-02-09 00:11

    Yes I reproduced your result with v1.9.2.

    library(data.table)
    
    DT <- data.table(timestamp=c(as.POSIXct("2013-01-01 17:51:00.707"),
                                 as.POSIXct("2013-01-01 17:51:59.996"),
                                 as.POSIXct("2013-01-01 17:52:00.059"),
                                 as.POSIXct("2013-01-01 17:54:23.901"),
                                 as.POSIXct("2013-01-01 17:54:23.914")))
    
    options(digits.secs=3)  # usually placed in .Rprofile
    
    DT
                     timestamp
    1: 2013-01-01 17:51:00.707
    2: 2013-01-01 17:51:59.996
    3: 2013-01-01 17:52:00.059
    4: 2013-01-01 17:54:23.901
    5: 2013-01-01 17:54:23.914
    
    duplicated(DT)
    ## [1] FALSE FALSE FALSE FALSE TRUE
    

    Update from v1.9.3 from Matt

    There was a change to rounding in v1.9.2 which affected milliseconds of POSIXct. More info here :

    Grouping very small numbers (e.g. 1e-28) and 0.0 in data.table v1.8.10 vs v1.9.2

    Large integers in data.table. Grouping results different in 1.9.2 compared to 1.8.10

    So, the workaround now available in v1.9.3 is :

    > setNumericRounding(1)   # default is 2
    > duplicated(DT)
    [1] FALSE FALSE FALSE FALSE FALSE
    

    Hope you understand why the change was made and agree that we're going in the right direction.

    Of course, you shouldn't have to call setNumericRounding(), that's just a workaround.

    I've filed a new item on the tracker :

    #5445 numeric rounding should be 0 or 1 automatically for POSIXct

    0 讨论(0)
提交回复
热议问题