R如何设置as.Date的默认起始日期?

11

有没有一种方法可以设置as.Date的默认起始日期?我做了这个函数来解决问题:

as.date=function(x, origin='1970-01-01') as.Date(x, origin=origin)
例如:
as.Date(0)
Error in as.Date.numeric(0) : 'origin' deve ser especificado

as.date(0)
[1] "1970-01-01"
4个回答

15

这个 zoo 包添加了一个默认的起始点:

library(zoo)

as.Date(0)
## [1] "1970-01-01"

更新

虽然已经过去了几年,但看起来R已经添加了.Date,因此我们现在可以仅使用基本的R来完成此操作。

.Date(0)
## [1] "1970-01-01"

1
我不知道我是不是小气,但我避免为小事加载包。 - xm1
@xm1,这是完全合理的,但这也意味着您会错过一些小细节,比如日期的默认起点。当然,您可以查看zoo包是如何实现并复制它。 - Gregor Thomas
1
@GregorThomas,我已经完成了我的as.date=function(x) as.Date(x,origin='1970-01-01') - xm1

4
有一个优雅而简单的解决方案,类似于动物园,但如果需要的话可以进行一些微调: require(anytime) 基本的方法很简单: anytime(0) 返回东部标准时间的值为:[1] "1969-12-31 19:00:00 EST" 如果你想将其强制转换为UTC时间: anytime(0, asUTC=TRUE) 返回结果为: [1] "1970-01-01 UTC" 如果你想告诉R你的数据来自某个特定的时区: Sys.setenv(TZ= 'desiredTimeZone') 其中 'desiredTimeZone' 是你的日期收集所在的时区。
以上任何答案都可以工作,这个答案只是让你对数字(或字符串)以及时区有更多的控制...因此,如果你正在处理远程收集的数据,它就是非常通用的。

3

不是真的。在会话中,无法更改“ origin”日期并使其永远适用。

如果您查看as.Date的参数(即函数),则当xnumeric时,origin没有默认值。

## S3 method for class 'numeric'
as.Date(x, origin, ...)

或许为as.Date函数提供origin的默认值是一个不错的扩展。

OP创建了包装函数来消除对origin的依赖,这样做很好。也许该函数可以稍微改进一下:

根据@sm1和@Gregor的建议修改的函数。

## if date.origin is not defined then origin will be taken as "1970-01-01
options(date.origin = "1970-01-01")
as.date <- function(x, origin = getOption("date.origin")){
  origin <- ifelse(is.null(origin), "1970-01-01", origin)
  as.Date(x, origin)
}

## Results: (When date.origin is not set)
## > as.date(0)
## [1] "1970-01-01"
## > as.date(2)
## [1] "1970-01-03"
## Results: (When date.origin is set)
## > options(date.origin = "1970-01-05")
## > as.date(2)
## [1] "1970-01-07"

1
难道只需要这样写不就更简单了吗?as.date <- function(x, origin = ORIGIN) - xm1
@xm1 这是个好观点。但我们需要考虑一种情况,即 ORIGIN 没有被定义。在这种情况下,函数不应崩溃或返回错误。 - MKR
1
最好设置/获取选项,而不是在全局环境中使用某些东西。 - Gregor Thomas
@Gregor 给出了很好的建议。我本来想处理 ORIGIN 未定义的情况,但似乎 option 更好。 - MKR

3

lubridate软件包是专门为使日期处理更加容易而设计的:

library(lubridate)
as_date(0)
#[1] "1970-01-01"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接