我有一个POSIXct变量,其值为“2012-04-15 16:49:36 CEST”。格式函数返回年份,一年中的星期和工作日的十进制数,对于此示例2012 15 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位机器上运行代码。谢谢大家!
答案 0 :(得分: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"