我正在操作一些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,但有没有更优雅和有效的方法来实现这一目标?
options(digits.secs = 3);
> strptime("2007-03-30 15:00:00.007", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.007"
> strptime("2007-03-30 15:00:00.008", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.008"
> strptime("2007-03-30 15:00:00.009", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.008"
> strptime("2007-03-30 15:00:00.010", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.01"
> strptime("2007-03-30 15:00:00.011", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.010"
> strptime("2007-03-30 15:00:00.999", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.998"
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么与"009"有一毫秒的差异,然后再从"011"那里得到.
我知道类似的事情已经讨论过但是这里有一些我还没有找到答案的东西.
> Sys.timezone()
[1] "EST"
> as.POSIXct("2011-01-30")
[1] "2011-01-30 EST"
> as.POSIXct(as.Date("2011-01-30"))
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="EST")
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="GMT")
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="America/New_York")
[1] "2011-01-29 19:00:00 EST"
> as.POSIXct(as.Date("2011-01-30"), tz="")
[1] "2011-01-29 19:00:00 EST"
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么,如果输入是日期,即使我指定了正确的时区,我也无法在1月30日午夜到达?如果输入是字符串,那么我没关系.
两者都非常缓慢.然后我发现要将字符串转换为Date,实际上通过首先将其转换为POSIXlt要快得多:
> d3.str = "2011-03-02 23:59:00";
> N=10000
> system.time(for(i in 1:N) r5.dt = as.Date(d3.str))
user system elapsed
1.25 0.00 1.24
> system.time(for(i in 1:N) r6.dt = as.Date(strptime(d3.str, format="%Y-%m-%d")))
user system elapsed
0.37 …Run Code Online (Sandbox Code Playgroud) > time1 = strptime("2010-03-01 00:15:00", format = "%Y-%m-%d %H:%M:%S")
> time2a = strptime("2010-03-01", format = "%Y-%m-%d")
> time2b = as.Date(time2a)
> difftime(time1, time2a)
Time difference of 15 mins
> difftime(time1, time2b)
Time difference of 5.25 hours
Run Code Online (Sandbox Code Playgroud)
在difftime的帮助页面中,接受日期对象(time2b).为什么结果错了(5.25小时)?
谢谢.
> my.lt <- strptime("2003-02-05 03:00:02", format="%Y-%m-%d %H:%M:%S")
> x <- data.frame(d=my.lt)
> class(x$d)
[1] "POSIXct" "POSIXt"
Run Code Online (Sandbox Code Playgroud)
我不知道为什么data.frame将x $ d从POSIXlt对象更改为POSIXct对象.现在,如果我这样做
> x$d = my.lt
Run Code Online (Sandbox Code Playgroud)
然后我得到了我想要的东西,但这很难看.任何人都可以告诉我1)为什么会这样; 2)如何初始化一个数据框,其中一列是一个整齐的POSIXlt.
谢谢.