我最近将R更新到版本3.2.3,现在我发现使用seq
日期有问题:
date1<-as.POSIXct("2014-01-30 02:00:00")
date2<-as.POSIXct("2014-12-24 11:00:00")
seq(date1,date2,by="month")
#[1] "2014-01-30 02:00:00 CET" "2014-03-02 02:00:00 CET"
#[3] NA "2014-04-30 02:00:00 CEST"
#[5] "2014-05-30 02:00:00 CEST" "2014-06-30 02:00:00 CEST"
#[7] "2014-07-30 02:00:00 CEST" "2014-08-30 02:00:00 CEST"
#[9] "2014-09-30 02:00:00 CEST" "2014-10-30 02:00:00 CET"
#[11] "2014-11-30 02:00:00 CET"
我不明白NA
的来源。我已尝试使用与我的R版本相同的R机器或之前的版本,并且在NA
的位置正确地给出了"2014-03-30"
。此外,如果我更改2014年至2015年的日期,则不会返回NAs
!
我想在安装过程中我的语言环境中的某些内容已被修改,但我无法理解如何解决问题。
Sys.getlocale()
返回:
"en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"
我的系统是Maverick的Mac Book Pro。 谢谢你的帮助!
答案 0 :(得分:5)
我猜是德国,这是3月30日(星期天)CET时区的情况
http://www.timetemperature.com/utc-converter/utc-20140330-germany-12.html
UTC or GMT Time Germany
Sunday 30th March 2014 00:00:00 Sun 01:00 AM
Sunday 30th March 2014 01:00:00 Sun 03:00 AM*
将设置更改为意大利,我得到相同的结果:
UTC or GMT Time Italy
Sunday 30th March 2014 00:00:00 Sun 01:00 AM
Sunday 30th March 2014 01:00:00 Sun 03:00 AM*
这里的关键是当时间是春天或秋天的清晨,或者间隔的计算超过这些日期时,要怀疑怪异。规则每年都在变化,因为各国经常在星期天或星期六早上进行转换,所以确切的日期会跳转。
这些变化因国家/地区而异,在美国可能会因州或甚至国家/地区而异。边界:2014年在华盛顿州,您会发现3月第二个星期日发生的变化:
http://www.timetemperature.com/utc-converter/utc-20140309-us-washington+state-12.html
UTC or GMT Time US-Washington State
snipped several times
Sunday 9th March 2014 07:00:00 Sat 11:00 PM
Sunday 9th March 2014 08:00:00 Sun 12:00 AM
Sunday 9th March 2014 09:00:00 Sun 01:00 AM
Sunday 9th March 2014 10:00:00 Sun 03:00 AM*
Sunday 9th March 2014 11:00:00 Sun 04:00 AM*
我和华盛顿州在同一个TZ。使用Sys.timezone设置,可以重现NA,至少在Mac上。时间和时区的实现是特定于操作系统的,因此可以看到这些奇异性如何变化的变化:
> Sys.timezone(location = TRUE)
[1] "America/Los_Angeles"
> date1<-as.POSIXct("2014-01-09 02:00:00")
> date2<-as.POSIXct("2014-12-09 11:00:00")
> seq(date1,date2,by="month")
[1] "2014-01-09 02:00:00 PST" "2014-02-09 02:00:00 PST"
[3] NA "2014-04-09 02:00:00 PDT"
[5] "2014-05-09 02:00:00 PDT" "2014-06-09 02:00:00 PDT"
[7] "2014-07-09 02:00:00 PDT" "2014-08-09 02:00:00 PDT"
[9] "2014-09-09 02:00:00 PDT" "2014-10-09 02:00:00 PDT"
[11] "2014-11-09 02:00:00 PST" "2014-12-09 02:00:00 PST"
答案 1 :(得分:1)
通过检查seq.POSIXt中的相关代码,出现了对seq的调用by =&#34; month&#34;工作如下
虽然结果NA在技术上是正确的,因为它试图将无效日期(&#34; 2014-01-30 02:00:00 CET&#34;,这不存在)转换为POSIXct,可能通过difftimes可能解决问题? [*]
不确定它是否值得,但是......
[*]这里的difftimes我的意思是在日期中添加正确的秒数而不是仅添加月份...