我有yyyy-ww
形式的星期日期数据,其中ww
是两位数的星期数。数据跨度为2007-01
到2010-30
。星期计数惯例为ISO 8601,如您在此处看到的on Wikipedia's "Week number" article所示,一年间偶尔达到53周。例如,通过该系统,2009年有53周,请在this ISO 8601 calendar中查看周数。 (请参见其他年份;根据Wikipedia的文章,第53周很少见。)
基本上,我想读取星期日期,将其转换为Date
对象,然后将其保存到data.frame
的单独列中。作为测试,我通过Date
将yyyy-ww
对象转换为format([Date-object], format = "%Y-%W"
格式,这在2009-53
上引发了错误。 R
无法将该周解释为日期。这很奇怪,因为其他没有53周(在ISO 8601标准中)的年份也可以很好地转换,例如2007-53
,而其他也没有53周(在ISO 8601标准中)的年份也可以失败,例如作为2008-53
下面的最小示例演示了该问题。
最小示例:
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
问题是,如何获得
R
以接受ISO 8601格式的星期数?注意:这个问题总结了我几个小时一直在努力的问题。我搜索并找到了各种有用的帖子,例如this,但没有一个解决了这个问题。
最佳答案
软件包ISOweek
管理ISO 8601样式的星期编号,在Date
中的R
对象之间来回转换。有关更多信息,请参见 ISOweek
。继续上面的示例日期,我们首先需要修改格式。它们必须采用yyyy-Www-w
的形式,而不是yyyy-ww
,即2009-W53-1
。最后一个数字标识用于标识星期的星期几,在本例中为星期一。周号必须是两位数。
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
关于r - 一年中的第53周?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14937837/