首页 文章

format.POSIXct to as.POSIXct转换问题[重复]

提问于
浏览
2

这个问题在这里已有答案:

我有一个POSIXct变量,其值为“2012-04-15 16:49:36 CEST” . 格式函数返回年份,一年中的星期和工作日的十进制数,对于此示例2012 15 0.对于不熟悉它的人的格式说明:

  • %Y:世纪的年份 .

  • %W:使用星期一作为星期的第一天(通常以一年的第一个星期一作为第1周的第1天)作为十进制数(00-53)的一年中的一周 . 英国大会 .

  • %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位机器上运行代码 . 谢谢你们!

1 回答

  • 1

    这似乎是个bug . 下面我创建2012年的一系列日期( dtimes )并使用'%Y %W %w'格式转换为字符串然后再返回 . 这两个系列进行了比较,并且 head 输出显示哪个日期时间是't preserved in the conversion. There',这是一个明显的每周模式 . 另请注意 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"
    

相关问题