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

时间:2012-01-13 21:12:36

标签: r date time posixct

我在操作一些POSIXlt DateTime对象。例如,我想添加一小时:

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" 

我希望new.lt成为POSIXlt对象。我知道我可以使用as.POSIXlt将其转换回POSIXlt,但是有更优雅和有效的方法来实现这一目标吗?

4 个答案:

答案 0 :(得分:14)

POSIXct - 分类对象在内部是一个允许数值计算的数值。 POSIXlt - 对象是内部列表。不幸的是,Ops.POSIXt(当你使用“+”时这就是所谓的)用这个代码强制到POSIXct:

if (inherits(e1, "POSIXlt") || is.character(e1)) 
        e1 <- as.POSIXct(e1)

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

> my.lt$hour <- my.lt$hour +1
> my.lt
[1] "2010-01-09 23:00:00"

如果您想避免关于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"

答案 1 :(得分:12)

简答:否

答案很长:

POSIXctPOSIXlt对象是更通用的POSIXt类的两种特定类型(不是严格面向对象的继承意义,而是面向准面向对象的实现意义)。代码在这些之间自由切换。当您添加到POSIXlt对象时,实际使用的函数是+.POSIXt,而不是专门用于POSIXlt的函数。在此函数中,参数将转换为POSIXct,然后处理(添加到)。

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

答案 2 :(得分:7)

它可能不是更优雅,但

seq.POSIXt( from=Sys.time(), by="1 hour", length.out=2 )[2]

恕我直言比

更具描述性
Sys.time()+3600;  # 60 minutes * 60 seconds

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

答案 3 :(得分:5)

?POSIXlt告诉你:

  

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

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

我会坚持简单:

new.lt = as.POSIXlt(my.lt + 3600)
class(new.lt)
[1] "POSIXlt" "POSIXt"

在您的时间操作之前添加as.POSIXlt并不是一件麻烦事。