将chr转换为数字

将chr转换为数字,r,datetime,floating-point,R,Datetime,Floating Point,我正在尝试将一个chr转换成一个数字。我试图转换的数字是“20171023063155.557”。当我使用as.numeric函数时,它给出了20171023063155.559。我尝试了几种不同的方法,但无法将其正确转换 任何帮助都将不胜感激 as.POSIXct("20171023063155.557", format = "%Y%m%d%H%M%OS") [1] "2017-10-23 06:31:55 PDT" > as.POSIXct("20171023063155.557",

我正在尝试将一个chr转换成一个数字。我试图转换的数字是“20171023063155.557”。当我使用as.numeric函数时,它给出了20171023063155.559。我尝试了几种不同的方法,但无法将其正确转换

任何帮助都将不胜感激

as.POSIXct("20171023063155.557", format = "%Y%m%d%H%M%OS")
[1] "2017-10-23 06:31:55 PDT"
> as.POSIXct("20171023063155.557", format = "%Y%m%d%H%M%S")
[1] "2017-10-23 06:31:55 PDT"

您的字符串实际上似乎是一个时间戳。因此,我建议你这样对待它。这里的一个选项是使用
as.POSIXct
将其转换为日期:

x <- "20171023063155.557"
y <- as.POSIXct(x, format = "%Y%m%d%H%M%OS")
为了验证毫秒精度信息实际上已存储在POSIXct对象中,我们可以调用
格式
来检查:

format(y, "%Y-%m-%d %H:%M:%OS6")
[1] "2017-10-23 06:31:55.556999"

您的字符串实际上似乎是一个时间戳。因此,我建议你这样对待它。这里的一个选项是使用
as.POSIXct
将其转换为日期:

x <- "20171023063155.557"
y <- as.POSIXct(x, format = "%Y%m%d%H%M%OS")
为了验证毫秒精度信息实际上已存储在POSIXct对象中,我们可以调用
格式
来检查:

format(y, "%Y-%m-%d %H:%M:%OS6")
[1] "2017-10-23 06:31:55.556999"
问题在于使用32位浮点数(class
float
)所造成的“舍入”差异,并且有效位数的默认数字R被配置为打印:

x <- as.numeric("20171023063155.557")
x
# [1] 2.017102e+13
getOption("digits")
# 7
options(digits=22)
x
# [1] 20171023063155.55859375
x问题在于使用32位浮点数(class
float
)产生的“舍入”差异,并且有效位数的默认数字R被配置为打印:

x <- as.numeric("20171023063155.557")
x
# [1] 2.017102e+13
getOption("digits")
# 7
options(digits=22)
x
# [1] 20171023063155.55859375


那是一个日期吗?如果是这样的话,您可能希望尝试将
as.POSIXct
作为一个数字,而不是一个日期,而是一个“正常”数字:这里解释了差异的原因:解决方案:改用
POSIXlt
:y是一个日期吗?如果是这样,您可能希望尝试将
as.POSIXct
it该数字不解释为日期,而是解释为“正常”数字:这里解释了差异的原因:解决方案:使用
POSIXlt
而不是:y正确,它是一个时间戳。但是,这段代码不保留毫秒,这对我的结果很重要。有什么想法吗?你是说它看起来像这样:
20171023063155
?如果是这样,那么只需将格式掩码更改为:
%Y%m%d%H%m%S
。我编辑了问题并使用了您提供的函数。这两种方式都没有毫秒,我认为问题是打印
POSIXct
对象时不会显示毫秒,但它们在那里。试试
格式(y,“%y%m%d%H%m%OS4”)
。你为什么担心这么高的精度?在任何情况下,浮点运算在许多编程语言(如C)中都是不精确的。这类事情是可以预料的。没错,这是一个时间戳。但是,这段代码不保留毫秒,这对我的结果很重要。有什么想法吗?你是说它看起来像这样:
20171023063155
?如果是这样,那么只需将格式掩码更改为:
%Y%m%d%H%m%S
。我编辑了问题并使用了您提供的函数。这两种方式都没有毫秒,我认为问题是打印
POSIXct
对象时不会显示毫秒,但它们在那里。试试
格式(y,“%y%m%d%H%m%OS4”)
。你为什么担心这么高的精度?在任何情况下,浮点运算在许多编程语言(如C)中都是不精确的。这类事情是可以预料的。我想没有函数可以精确地转换它。浮点运算不一定精确。也许你应该编辑你的问题,让我们知道为什么这对你的应用程序很重要。也许你可以调整一些浮点选项(参见
?.Machine
,但如果使用浮点数,这最终不是R的技术限制,而是任何编程语言的技术限制。因此,是的,我认为通常没有办法精确转换它:-(我不知道,我只是在分析,我想没有函数可以精确地转换它?浮点运算不一定精确。也许你应该编辑你的问题,让我们知道为什么这对你的应用程序很重要。也许你可以调整一些浮点选项。)(参见
?.Machine
,但如果使用浮点数,这最终不是R的技术限制,而是任何编程语言的技术限制。因此,是的,我认为通常没有办法精确地转换它:-(我不知道,我只是分析而已)