在R中的For循环中转换日期 - 必须提供原点

时间:2015-12-03 00:00:17

标签: r date for-loop seq posixlt

我在R中有一系列日期,对于每个日期我需要获得年,月和日。我尝试使用strftime函数打印出年份,但R表现得非常奇怪。此代码失败:

# 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 个答案:

答案 0 :(得分:2)

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)
}