sun*_*unt 16 time r date 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"
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
简答:不
答案很长:
POSIXct
和POSIXlt
对象是更一般的POSIXt
类的两种特定类型(不是严格面向对象的继承意义,而是在面向对象的实现意义上).代码在这些之间自由切换.添加到POSIXlt
对象时,使用的实际函数+.POSIXt
不是专门用于的对象POSIXlt
.在这个函数里面,参数被转换成a POSIXct
然后处理(添加到).
此外,POSIXct
是特定日期和时间的秒数.POSIXlt
是一个日期部分的列表(秒,分钟,小时,一个月,一个月,一年,一周中的一天,一年中的一天,DST信息),所以直接添加到那个没有任何意义.将它转换为秒数(POSIXct
)并添加到它确实有意义.
它可能不会更加优雅,但是
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).
?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
在您的时间操作之前添加并不是那么麻烦.