2015-12-03 126 views
0

我在R中有一个日期序列,并且对于每个日期我需要获得年份,月份和日期。我试图用strftime函数打印出年份,但是R的行为非常奇怪。此代码失败:必须提供R-来源For循环中的转换日期

# sequence of dates 
dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

# this fails with "'origin' must be supplied" error: 
for (d in dates) { 
    year <- strftime(d, "%Y") 
    print(year) 
} 

确切的错误信息是:Error in as.POSIXlt.numeric(x, tz = tz) : 'origin' must be supplied

在另一方面,此代码的工作没有任何错误:

# sequence of dates 
dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

# this works 
for (i in 1: length(dates)) { 
    year <- strftime(dates[i], "%Y") 
    print(year) 
} 

为什么第一个例子失败,第二示例工程?我怀疑在第一个例子中,R正试图将我的日期转换为某种POSIXct对象,而在第二个例子中它不是?我很困惑,为什么有什么不同,我会很感激解释发生了什么。我正在使用R版本3.2.2。

+1

相关:[在日期对象上循环导致数字迭代器](http://stackoverflow.com/q/6434663/271616)。 –

回答

1

for正在创建d作为数字。这里有两种方法。

下面的评论被删除,只有标记为##的代码行已被更改。

1)名单使用列表如下:

dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

for (d in as.list(dates)) { ## 
    year <- strftime(d, "%Y") 
    print(year) 
} 

2)as.Date或转换d"Date"类。

dates <- seq(as.Date("1987-03-29"), as.Date("1991-12-31"), by=1) 

for (d in dates) { 
    year <- strftime(as.Date(d, origin = "1970-01-01"), "%Y") ## 
    print(year) 
} 
+0

有意思...所以这就是为什么当我为(d日期){打印(d)}'我得到的数字像8033,8034,... – jirikadlec2