0

我的数据在EST时区的时间,我尝试使用这个时区。

我想计算星期(在当地时间,而不是GMT),所以我手动定义了一个originTimeinEDT

originTime = as.POSIXlt('2000-01-02 00:00:00 EDT')
dt2 = data.frame(time=c(as.POSIXlt('2000-01-09 00:00:05 EDT')))
dt2$week = as.integer( floor( ( as.numeric(dt2$time) - as.numeric(originTime) ) /(3600*24*7) ) )
dt2$wday = weekdays(dt2$time)

这行得通。

现在我想知道,给定时间后的一周是什么?

> as.POSIXlt( 1 * 3600*24*7 , origin = originTime)
[1] "2000-01-08 19:00:00 EST"

这是问题所在,R 似乎认为originTimeGMT. 有人可以帮忙吗?谢谢

4

1 回答 1

2

两个严重的问题。EDT 并不真正存在,即使它存在也不适合 1 月的日期。(美国)东部时区是“EST5EDT”,以使其与 Ozzie EST 区分开来。(此外,这些在不同的操作系统上可能会有所不同。)最安全的是tz="America/New_York". 对于数据输入,您需要使用“tz”参数并更改“usetz”的默认(FALSE)设置:

(originTime = as.POSIXlt('2000-01-02 00:00:00', format="%Y-%m-%d %H:%M:%S",
                          tz="EST5EDT", usetz=TRUE) )
[1] "2000-01-02 EST"

使用“%Z”的测试,仅用于输出:

> format( as.POSIXlt('2000-01-02 00:00:00', format="%Y-%m-%d %H:%M:%S", 
                                            tz="America/New_York", usetz=TRUE) ,
         format="%Y-%m-%d %H:%M:%S %Z")
[1] "2000-01-02 00:00:00 EST"

我从未在 as.POSIXlt 中使用过 origin 参数,因此无法真正解释为什么它无法提供我一直使用的预期结果+.POSIXtseq.POSIXt构建间隔:

format(as.POSIXlt('2000-01-02 00:00:00', tz="America/New_York", usetz=TRUE)+ 1*3600*24*7, 
       format="%Y-%m-%d %H:%M:%S %Z")  #  %Z is only used for output
 # [1] "2000-01-09 00:00:00 EST"   A week later at midnight.

我认为需要使用格式参数强制打印时间的原因是午夜时间缩短为仅打印日期而没有进一步的 H:M:S 信息。

于 2015-09-10T23:43:09.420 回答