首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R使用as.Date()转换带有BST/GMT标记的POSIXct日期

R使用as.Date()转换带有BST/GMT标记的POSIXct日期
EN

Stack Overflow用户
提问于 2012-01-09 21:02:46
回答 3查看 2.5K关注 0票数 3

我需要在zoo对象的索引上使用as.Date。有些日期是在BST中,所以当转换时,我在这些条目上(只)损失了一天。我根本不关心一个小时的差异,甚至不关心日期的时间部分,我只想确保显示的日期保持不变。我猜这不是很难,但我做不到。有人能帮帮忙吗?

代码语言:javascript
运行
复制
class(xtsRet)
#[1] "xts" "zoo"

index(xtsRet)
#[1] "2007-07-31 BST" "2007-08-31 BST" "2007-09-30 BST" "2007-10-31 GMT"

class(index(xtsRet))
#[1] "POSIXt"  "POSIXct"

index(xtsRet) <- as.Date(index(xtsRet))

index(xtsRet)
#[1] "2007-07-30" "2007-08-30" "2007-09-29" "2007-10-31"

可重复性最低的示例(不需要zoo包):

代码语言:javascript
运行
复制
my_date <- as.POSIXct("2007-04-01") # Users in non-UK timezone will need to
                                    # do as.POSIXct("2007-04-01", "Europe/London")
my_date
#[1] "2017-04-01 BST"

as.Date(my_date)
#[1] "2017-03-31"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-09 21:41:33

您可以对POSIX对象进行偏移,这样它就不会在午夜前后发生变化。1小时(3600秒)应该足够了:

代码语言:javascript
运行
复制
d <- as.POSIXct(c("2007-07-31","2007-08-31","2007-09-30","2007-10-31"))
d
[1] "2007-07-31 BST" "2007-08-31 BST" "2007-09-30 BST" "2007-10-31 GMT"

as.Date(d)
[1] "2007-07-30" "2007-08-30" "2007-09-29" "2007-10-31"
as.Date(d+3600)
[1] "2007-07-31" "2007-08-31" "2007-09-30" "2007-10-31"
票数 4
EN

Stack Overflow用户

发布于 2012-01-09 21:39:23

假设我们有以下示例数据:

代码语言:javascript
运行
复制
library(zoo)
x <- as.POSIXct("2000-01-01", tz = "GMT")

然后看看这些是不是你想要的:

代码语言:javascript
运行
复制
# use current time zone
as.Date(as.character(x, tz = ""))

# use GMT
as.Date(as.character(x, tz = "GMT"))

# set entire session to GMT
Sys.setenv(TZ = "GMT")
as.Date(x)

另外,请尝试用"BST"代替"GMT",并注意关于R News 4/1中的日期和时间的文章。

票数 5
EN

Stack Overflow用户

发布于 2020-04-02 23:55:12

我建议使用as.POSIXlt转换为包装在as.Date中的date对象:

代码语言:javascript
运行
复制
d <- as.POSIXct(c("2007-07-31","2007-08-31","2007-09-30","2007-10-31"))

d
[1] "2007-07-31 BST" "2007-08-31 BST" "2007-09-30 BST" "2007-10-31 GMT"

as.Date(as.POSIXlt(d))
[1] "2007-07-31" "2007-08-31" "2007-09-30" "2007-10-31"

实现了与上面的+3600相同的功能,但减少了一点

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8788817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档