seq.Date给出问题

时间:2016-01-18 17:11:25

标签: r

我最近将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。 谢谢你的帮助!

2 个答案:

答案 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;工作如下

  • [对数据的一些操纵]
  • data1&amp;的转换data2到POSIXlt
  • 创建跨越从data1到data2的间隔的月份数字序列(在本例中为0,...,11)
  • 手动更新data1 $ mon到这个月的序列(到目前为止,所有日期都已妥善处理)
  • 最后,生成的日期将转换为POSIXct,此处NA显示

虽然结果NA在技术上是正确的,因为它试图将无效日期(&#34; 2014-01-30 02:00:00 CET&#34;,这不存在)转换为POSIXct,可能通过difftimes可能解决问题? [*]

不确定它是否值得,但是......

[*]这里的difftimes我的意思是在日期中添加正确的秒数而不是仅添加月份...