我想使用POSIXct
将数字变量转换为anytime
。我的问题是anytime(<numeric>)
也会转换输入变量-我想保留它。
简单的例子:
library(anytime)
t_num <- 1529734500
anytime(t_num)
# [1] "2018-06-23 08:15:00 CEST"
t_num
# [1] "2018-06-23 08:15:00 CEST"
这不同于as.POSIXct
R中base
的“不按引用更新”行为:
t_num <- 1529734500
as.POSIXct(t_num, origin = "1970-01-01")
# [1] "2018-06-23 08:15:00 CEST"
t_num
# 1529734500
类似地,anydate(<numeric>)
也通过引用进行更新:
d_num <- 17707
anydate(d_num)
# [1] "2018-06-25"
d_num
# [1] "2018-06-25"
我在?anytime
中找不到对此行为的明确描述。我可以如上所述使用as.POSIXct
,但是有人知道如何在anytime
中处理吗?
答案 0 :(得分:10)
anytime
的作者:这是标准的R和Rcpp以及传递SEXP
的行为:您无法保护SEXP
的传递不被更改。
anytime
的观点是您正在要求将输入转换为POSIXct
,因为anytime
所做的就是:从char ,从整数,从因数,从任何事物。由于POSIXct
实际上是 一个数字值(加上S3类属性),所以这就是您得到的。
如果您不希望这样做(与anytime
的设计相反),可以执行@Moody_Mudskipper和@PKumar显示的操作:使用临时表达式(或变量)。
(我也认为data.table
的示例有点不公平,因为data.table
就像Rcpp
一样,非常明确地表示了在可能的地方进行引用。因此,它当然引用了回到原始变量。如果需要,有一些用于深层复制的惯用法。
最后,一个明显的技巧是如果您只想使用不同的显示,请使用format
:
R> d <- data.frame(t_num=1529734500)
R> d[1, "posixct"] <- format(anytime::anytime(d[1, "t_num"]))
R> d
t_num posixct
1 1529734500 2018-06-23 01:15:00
R>
由于字符串表示形式是类型更改,因此在data.table
中的工作方式相同。 IDate
/ ITime
的同上。
编辑:自2017年6月以来,Github存储库中的开发版本具有保留传入参数的功能。因此,无论何时我推它,下一个CRAN版本也将具有它。 / p>
答案 1 :(得分:2)
您可以这样修改它:
library(anytime)
t_num <- 1529734500
anytime(t_num+0)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_num
# [1] 1529734500
请注意,整数输入将被区别对待:
t_int <- 1529734500L
anytime(t_int)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_int
# [1] 1529734500
答案 2 :(得分:2)
如果您这样做,它将起作用:
t_num <- 1529734500
anytime(t_num*1)
#> anytime(t_num*1)
#[1] "2018-06-23 06:15:00 UTC"
#> t_num
#[1] 1529734500
答案 3 :(得分:2)
是否有理由与anytime
结婚?
.POSIXct(t_num, tz = 'Europe/Berlin')
# [1] "2018-06-23 08:15:00 CEST"
.POSIXct(x, tz)
是structure(x, class = c('POSIXct', 'POSIXt'), tzone = tz)
的包装(即您可以忽略声明原点),并且本质上是as.POSIXct.numeric
(除了后者在允许使用非UTC原始日期方面非常灵活),看print(as.POSIXct.numeric)
。
答案 4 :(得分:2)
在发布问题之前完成作业时,我检查了open anytime
issues。现在,我还浏览了 closed ,发现与我的问题完全相同:
软件包作者在其中写道:
我想是因为
as.POSIXct()
不理会输入内容,我们也应该这样做吗?
因此来自anytime version 0.3.1 (unreleased)
:
现在将保留数字输入,而不是将其静默转换为返回对象类型
因此,我的问题的一个答案是:“等待0.3.1
” *。
发布0.3.1
时,anytime(<numeric>)
的行为将与anytime(<non-numeric>)
和as.POSIXct(<numeric>)
一致,并且不需要解决方法。
*不必等待太久:0.3.1 is now released:“ 现在保留了数字输入,而不是无声地强制转换为返回对象类型”