format.POSIXct到as.POSIXct的转换问题

format.POSIXct到as.POSIXct的转换问题,r,timestamp,posixct,R,Timestamp,Posixct,我有一个值为“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-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这似乎是一个bug。下面我创建了2012年的一系列日子(
dtimes
)并转换为字符串,然后使用“%Y%W%W”格式再次返回。比较这两个序列,并且
head
输出显示转换中未保留的日期时间。有一个明显的每周模式。还要注意
as.POSIXct('2012 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" 

d时间这更好地说明了这个问题:
format(as.POSIXct(“2012-01-01 CEST”),format=“%Y%W%W”);as.POSIXct(“2012 1 0”,format=“%Y%W%W”)
。2012-01-01是一个星期天。2006年也存在同样的问题,也是在星期天开始的。已知此错误:此错误最近已修复:
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"