如何在保持其R类的同时从POSIXlt时间加/减时间?

sun*_*unt 16 time r date posixct

我正在操作一些POSIXltDateTime对象.例如,我想添加一个小时:

my.lt = as.POSIXlt("2010-01-09 22:00:00")
new.lt = my.lt + 3600
new.lt
# [1] "2010-01-09 23:00:00 EST"
class(new.lt)
# [1] "POSIXct" "POSIXt" 
Run Code Online (Sandbox Code Playgroud)

事情是我想new.lt成为一个POSIXlt对象.我知道我可以用as.POSIXlt它来转换回来POSIXlt,但有没有更优雅和有效的方法来实现这一目标?

42-*_*42- 16

POSIXct-classed对象在内部是一个允许数值计算的数值.POSIXlt - 对象是内部列表.不幸的是,你的欲望,Ops.POSIXt(当你使用"+"时所谓的)用这段代码强制到POSIXct:

if (inherits(e1, "POSIXlt") || is.character(e1)) 
        e1 <- as.POSIXct(e1)
Run Code Online (Sandbox Code Playgroud)

幸运的是,如果您只想和一小时有一个方便的替代方法,可以添加3600.而是使用列表结构并将1添加到小时元素:

> my.lt$hour <- my.lt$hour +1
> my.lt
[1] "2010-01-09 23:00:00"
Run Code Online (Sandbox Code Playgroud)

如果您想避免关于DST更改的棘手问题,这种方法非常方便,至少如果您想要添加天数来为您提供相同的时间.

编辑(添加@ sunt的代码,证明Ops.POSIXlt小心时间"溢出".))

my.lt = as.POSIXlt("2010-01-09 23:05:00") 
my.lt$hour=my.lt$hour+1 
my.lt
# [1] "2010-01-10 00:05:00"
Run Code Online (Sandbox Code Playgroud)


Bri*_*ggs 12

简答:不

答案很长:

POSIXctPOSIXlt对象是更一般的POSIXt类的两种特定类型(不是严格面向对象的继承意义,而是在面向对象的实现意义上).代码在这些之间自由切换.添加到POSIXlt对象时,使用的实际函数+.POSIXt不是专门用于的对象POSIXlt.在这个函数里面,参数被转换成a POSIXct然后处理(添加到).

此外,POSIXct是特定日期和时间的秒数.POSIXlt是一个日期部分的列表(秒,分钟,小时,一个月,一个月,一年,一周中的一天,一年中的一天,DST信息),所以直接添加到那个没有任何意义.将它转换为秒数(POSIXct)并添加到它确实有意义.


woo*_*dvi 7

它可能不会更加优雅,但是

seq.POSIXt( from=Sys.time(), by="1 hour", length.out=2 )[2]
Run Code Online (Sandbox Code Playgroud)

恕我直言比描述更具描述性

Sys.time()+3600;  # 60 minutes * 60 seconds
Run Code Online (Sandbox Code Playgroud)

因为代码本身记录了你要用"POSIX""seq"uence增加"1小时",但这是一个品味问题.在POSIXlt上工作正常,但请注意它以任何一种方式返回POSIXct.也适用于"天".有关如何处理月份,夏令时等的详细信息,请参阅帮助(seq.POSIXt).


Pie*_*nte 5

?POSIXlt 告诉你:

需要在两个日期时间类之间进行的任何转换都需要一个时区:从"POSIXlt"到"POSIXct"的转换将验证所选时区的时间.

所以我猜3600不是一个POSIXlt对象,有一个自动转换.

我会坚持简单:

new.lt = as.POSIXlt(my.lt + 3600)
class(new.lt)
[1] "POSIXlt" "POSIXt"
Run Code Online (Sandbox Code Playgroud)

as.POSIXlt在您的时间操作之前添加并不是那么麻烦.