如何将日期格式更改为年月周?

4
我有日期,格式为年月日,我想将其转换为年月周的格式,如下所示:
date            dateweek
2015-02-18   -> 2015-02-8
2015-02-19   -> 2015-02-8
2015-02-20   -> ....
2015-02-21   
2015-02-22   
2015-02-23   
2015-02-24      ...
2015-02-25   -> 2015-02-9
2015-02-26   -> 2015-02-9
2015-02-27   -> 2015-02-9

我尝试过

data$dateweek <- week(as.POSIXlt(data$date))

但是这只返回了周数,没有对应的年份和月份。

我还尝试了以下方法:

data$dateweek <- as.POSIXct('2015-02-18')
data$dateweek <- format(data$dateweek, '%Y-%m-%U')
# data$dateweek <- format(as.POSIXct(data$date), '%Y-%m-%U')

但是相应的列看起来很奇怪:

date         datetime
2015-01-01  2015-01-00
2015-01-02  2015-01-00  
2015-01-03  2015-01-00  
2015-01-04  2015-01-01  
2015-01-05  2015-01-01  
2015-01-06  2015-01-01  
2015-01-07  2015-01-01  
2015-01-08  2015-01-01  
2015-01-09  2015-01-01  
2015-01-10  2015-01-01  
2015-01-11  2015-01-02
1个回答

8

您需要使用'%Y-%m-%V'格式进行更改:

mydate <- as.POSIXct('2015-02-18')

> format(mydate, '%Y-%m-%V')
[1] "2015-02-08"

从文档 strptime 中得知:

%V

按照 ISO 8601 定义的一年中的周数,用十进制表示(00-53)。如果以星期一为开始的一周包含新年的第一天及其后的四天或更多天,则它被认为是第一周。否则,它是上一年的最后一周,下一周就是第一周。(输入时接受但忽略)

还有(美国惯例):

%U

一年中的周数,使用星期日作为第一天,用十进制表示(00-53),通常将一年中的第一个星期日视为第一周的第一天。美国惯例。

这取决于您要在您的情况下使用哪个。

mydate <- as.POSIXct('2015-02-18')

> format(mydate, '%Y-%m-%U')
[1] "2015-02-07"

在您的情况下,您应该执行以下操作:
data$dateweek <- format(as.POSIXct(data$date), '%Y-%m-%U')

有什么奇怪的地方吗?美国的惯例不同。你可能需要使用常规惯例:data$dateweek <- format(as.POSIXct(data$date), '%Y-%m-%V'),即使用 %V 而不是 %U> format(as.POSIXct('2015-01-01'), '%Y-%m-%V') [1] "2015-01-01" - LyzandeR
奇怪的是,data$week<-week(as.POSIXlt(data$date)) 返回数字周数,第一周有七天,也就是1周,而data$dateweek <- format(as.POSIXct(data$date), '%Y-%m-%V') 在3天后开始第二周。 - Mamba
那么这个和这个有什么不同呢?format(as.POSIXct('2015-01-01'), '%Y-%m-%V') [1] "2015-01-01"。另外,week函数来自哪个包? - LyzandeR
我只使用了 require(xts) 和 require(lubridate)。 - Mamba
1
它来自于 lubridate。如果您键入?week,您可以看到如何计算周。它与%V格式仅略有不同。我建议您使用那个,即data$dateweek <- format(as.POSIXct(data$date), '%Y-%m-%V')。实际上,在您的情况下,两者的计算应该是相同的(使用%V格式)。 - LyzandeR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接