2

我有一个值为“2012-04-15 16:49:36 CEST”的 POSIXct 变量。format 函数以十进制数字返回年、周和工作日,在本例中为 2012 15 0。对格式不太熟悉的人的说明:

  • %Y:带世纪的年份。
  • %W:以十进制数表示的一年中的第几周 (00–53),使用星期一作为一周的第一天(通常将一年中的第一个星期一作为第 1 周的第 1 天)。英国公约。
  • %w:工作日为十进制数(0-6,星期日为 0)。

然后,我尝试将这些值转换回 POSIXct 变量,但发生了一些意想不到的事情。当我读取这些值时,这些函数似乎解释了错误的日期(2012-04-08)。但是,当我使用 Sys.time() 对第二个示例执行相同的过程并且它按预期工作时,令人惊讶的是。有人能解释一下为什么它在第一个例子中不起作用吗?

(TS <- structure(1334501376, class = c("POSIXct", "POSIXt")))
(TS_YWw <- format(TS,format="%Y %W %w"))
as.POSIXct(TS_YWw,format="%Y %W %w")   

(TS <- Sys.time())
(TS_YWw <- format(TS,format="%Y %W %w"))
as.POSIXct(TS_YWw,format="%Y %W %w")

输出

> (TS <- structure(1334501376, class = c("POSIXct", "POSIXt")))
[1] "2012-04-15 16:49:36 CEST"
> (TS_YWw <- format(TS,format="%Y %W %w"))
[1] "2012 15 0"
> as.POSIXct(TS_YWw,format="%Y %W %w")
[1] "2012-04-08 CEST"
> 
> (TS <- Sys.time())
[1] "2013-05-16 15:27:44 CEST"
> (TS_YWw <- format(TS,format="%Y %W %w"))
[1] "2013 19 4"
> as.POSIXct(TS_YWw,format="%Y %W %w")
[1] "2013-05-16 CEST"

顺便说一句,我在一台装有 R 2.15.3 的 Windows XP 32 位机器上运行了代码。谢谢你们!

4

1 回答 1

1

这似乎是一个错误。下面我创建了 2012 年的日期序列 ( dtimes) 并使用 '%Y %W %w' 格式转换为字符串并再次返回。比较这两个系列,head输出显示转换中未保留哪些日期时间。有一个明显的每周模式。另请注意,as.POSIXct('2012 0 0', '%Y %W %w')返回NA.

dtimes <- seq(as.POSIXct('2012-1-1'), as.POSIXct('2013-1-1'), by=as.difftime(1, units='days'))

convert.YWw <- function(dtime) {
    fmt <- "%Y %W %w"
    string <- format(dtime, format=fmt)
    as.POSIXct(string, format=fmt)
}
converted <- lapply(dtimes, convert.YWw)
preserved <- dtimes == converted
dtimes.and.converted <- mapply(function(d, c) c(dtime=d, convert=c), dtimes, converted, SIMPLIFY=FALSE)
head(dtimes.and.converted[! preserved])

# [[1]]
# NULL
# 
# [[2]]
#            dtime          convert 
# "2012-01-08 EST" "2012-01-01 EST" 
# 
# [[3]]
#            dtime          convert 
# "2012-01-15 EST" "2012-01-08 EST" 
# 
# [[4]]
#            dtime          convert 
# "2012-01-22 EST" "2012-01-15 EST" 
# 
# [[5]]
#            dtime          convert 
# "2012-01-29 EST" "2012-01-22 EST" 
# 
# [[6]]
#            dtime          convert 
# "2012-02-05 EST" "2012-01-29 EST" 
于 2013-05-16T14:28:44.887 回答