2013-02-18 42 views
12

yyyy-ww formunda, haftalık tarih verileri var, burada ww, iki basamaktaki hafta sayısıdır. Veri 2007-01 - 2010-30. Hafta sayım sözleşmesi, on Wikipedia's "Week number" article numaralı telefonu görebileceğiniz gibi, bir yılda 53 haftaya ulaşan ISO 8601'dir. Örneğin, 2009'un bu sistem tarafından 53 haftası vardı, this ISO 8601 calendar'daki hafta numaralarına bakın. (Diğer yıllara bakın; Vikipedi makalesine göre, 53. haftalar oldukça nadirdir.)Yılın 53. haftası R?

Temel olarak, hafta içi tarihi okumak, Date nesnesine dönüştürmek ve bunu data.frame içinde ayrı bir sütuna kaydetmek istiyorum. Bir test olarak, nesnelerini biçemlerini format([Date-object], format = "%Y-%W" ile yeniden dönüştürdüm ve bu, 2009-53 numaralı telefondan bir hata verdi. O hafta bir tarih olarak R tarafından yorumlanamaz. değil, diğer yılların 2007-53 gibi otomatik olarak dönüştürüldüğü gibi diğer yıllar gibi, 53 yıl (aynı zamanda ISO 8601 standardı) de yok Örneğin, aşağıdaki en küçük örnek sorunu göstermektedir.

Minimal örnek:

dates <- c("2009-50", "2009-51", "2009-52", "2009-53", "2010-01", "2010-02") 
as.Date(x = paste(dates, 1), format = "%Y-%W %w") 
# [1] "2009-12-14" "2009-12-21" "2009-12-28" NA   "2010-01-04" 
# [6] "2010-01-11" 

other.dates <- c("2007-53", "2008-53", "2009-53", "2010-53") 
as.Date(x = paste(other.dates, 1), format = "%Y-%W %w") 
# [1] "2007-12-31" NA   NA   NA  

, nasıl ISO 8601 biçiminde hafta numaralarını kabul R alabilirim Esas soru

Not: Bu soru, birkaç saat boyunca uğraştığım bir sorunu özetler. Ben this gibi çeşitli yararlı mesajlar aradı ve buldum, ama hiçbiri sorunu çözmedi.

+1

'as.Date (x = "2009-01 01", format = "% Y-% W% ağırlık") ISOweek2date (" 2009-W01-1 'ile' karşılaştırma daha açıklayıcı olabilir ")' ve ayrıca '% W' için' yardım (strptime) 'girişini de belirtmelisiniz. – Roland

+0

Emin değilim, ama pek çok R'nin tarih işlemesinin aslında sistem kütüphaneleri tarafından ele alındığını hatırlıyorum. Bu, bu tür bir sorunun (OS) OS'den OS'ye çok değişeceği anlamına gelir; (b) özellikle Windows'ta tehlikeli olabilir; (c) R'nin kendisinde düzeltmek zor olurdu (aşağıdaki yanıtta görüldüğü gibi; 'ISOweek', Windows 'sistem kitaplıklarından malzeme eksik olduğu için kendi algoritmalarını kullanır) –

+0

@BenBolker Davranış,' help (strptime) 'olarak tanımlanır . – Roland

cevap

10

ISOweek paketi, R ürününe ve nesnelerine dönüştüren ISO 8601 stil hafta numaralarını yönetir. Daha fazla bilgi için bkz. ISOweek. Yukarıdaki örnek tarihlere devam edersek, önce bir bit formatını değiştirmemiz gerekir. Onlar yyyy-ww, yani 2009-W53-1 yerine yyyy-Www-w formunda olmalıdırlar. Son basamak haftanın hangi gününü tanımlamakta kullanılacağını tanımlar, bu durumda bu Pazartesi'dir. Hafta numarası iki haneli olmalıdır.

library(ISOweek) 

dates <- c("2009-50", "2009-51", "2009-52", "2009-53", "2010-01", "2010-02") 
other.dates <- c("2007-53", "2008-53", "2009-53", "2010-53") 

dates <- sub("(\\d{4}-)(\\d{2})", "\\1W\\2-1", dates) 
other.dates <- sub("(\\d{4}-)(\\d{2})", "\\1W\\2-1", other.dates) 

## Check: 
dates 
# [1] "2009-W50-1" "2009-W51-1" "2009-W52-1" "2009-W53-1" "2010-W01-1" 
# [6] "2010-W02-1" 

(iso.date <- ISOweek2date(dates))    # deal correctly 
# [1] "2009-12-07" "2009-12-14" "2009-12-21" "2009-12-28" "2010-01-04" 
# [6] "2010-01-11" 
(iso.other.date <- ISOweek2date(other.dates)) # also deals with this 
# [1] "2007-12-31" "2008-12-29" "2009-12-28" "2011-01-03" 

## Check that back-conversion works: 
all(date2ISOweek(iso.date) == dates) 
# [1] TRUE 

## This does not work for the others, since the 53rd week of 
## e.g. 2008 is back-converted to the first week of 2009, in 
## line with the ISO 6801 standard. 
date2ISOweek(iso.other.date) == other.dates 
# [1] FALSE FALSE TRUE FALSE