2015-12-03 125 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