r - 将POSIXct转换为毫秒

时间:2016-04-12 03:04:11

标签: r posixct

来自Port Nat我们知道

  

Class" POSIXct"表示自1970年初以来(在UTC时区中)作为数字向量的(有符号)秒数。

因此,我假设要获得?POSIXct值,以毫秒为单位,我们需要乘以POSIXct

考虑2015年12月的日子

1000

将它们转换为整数

## generate sequence of days in December 2015
d <- seq(as.POSIXct("2015-12-01"), as.POSIXct("2015-12-31"), by = 60*60*24)
#  [1] "2015-12-01 AEDT" "2015-12-02 AEDT" 
#  ...
# [29] "2015-12-29 AEDT" "2015-12-30 AEDT" "2015-12-31 AEDT"

我们看到每个整数都是d <- as.integer(d) 位数

10

当乘以1000转换为毫秒时,我们得到

nchar(d)
# [1] 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

某些值只有11或12位数(而我认为将10位数乘以1000会增加3位数)

我有没有看到这样的解释?

1 个答案:

答案 0 :(得分:2)

摘要答案

对此的简短回答是如何以科学格式打印数字

要看到这一点,我们可以设置options(scipen=1000),我们会按预期得到结果。

options(scipen=1000); 
nchar(d*1000)
# [1] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

更长的回答

此问题的背景来自尝试使用library(mongolite)中的日期范围查询 mongodb 数据库

例如,this questionthis issue表示要查询日期,需要将其转换为numberLong才能使查询正常工作。

为了证明这一点,以及我遇到的问题,请考虑此数据和后续查询

library(mongolite)

df <- data.frame(date = as.POSIXct(c("2015-12-19","2015-12-20","2015-12-21")),
                 val = c(1,2,3))

mongo <- mongo(collection = "test", db = "test", url = "mongodb://localhost")

## insert data into test database
mongo$insert(df)

## querying the 19th December 2015 works as expected, because d is formatted with 13 digits
d <- as.integer(as.POSIXct("2015-12-19")) * 1000
q <- paste0('{"date" : {"$date" : { "$numberLong" : "', d,'" } } }')
mongo$find(query = q)
# 
# Imported 1 records. Simplifying into dataframe...
# date val
# 1 2015-12-19   1

## the 20th December 2015 errors, as d is formatted with < 13 digits
d <- as.integer(as.POSIXct(("2015-12-20"))) * 1000
q <- paste0('{"date" : {"$date" : { "$numberLong" : "', d,'" } } }')
mongo$find(query = q)
#
# Error: Invalid input string 1.45053e+12, looking for 11

## the 21st December 2015 works as expected because d is formatted with 13 digits.
d <- as.integer(as.POSIXct("2015-12-21")) * 1000
q <- paste0('{"date" : {"$date" : { "$numberLong" : "', d,'" } } }')
mongo$find(query = q)
#
# Imported 1 records. Simplifying into dataframe...
# date val
# 1 2015-12-21   3

## cleanup 
rm(mongo); gc()

所以要解决此问题,我需要设置options(scipen=1000),或者在进入查询时用{0}右键填充我的d