我在操作一些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
,但是有更优雅和有效的方法来实现这一目标吗?
答案 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)
简答:否
答案很长:
POSIXct
和POSIXlt
对象是更通用的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
并不是一件麻烦事。