首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换年份/周到日期对象

转换年份/周到日期对象
EN

Stack Overflow用户
提问于 2017-08-07 14:32:22
回答 2查看 20.6K关注 0票数 14

字符串包含“年度周”,我希望使用parse_date_time()将其转换为date对象,但无法使代码工作:

代码语言:javascript
复制
parse_date_time(c("201510"), "YW")

我不用用润滑油,也可以是其他的包。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-09 10:08:46

在将年度周转换为日期之前,您必须指定一周中的某一天,但更重要的是,您必须确保使用的是哪一种不同的约定。

基R的strptime()函数知道一年中周的3种定义(但只支持其中的2种)和工作日数的2种定义,参见?strptime

一年中的每周

  • 美国会议:一年中的一周作为十进制数(00-53),使用星期日作为一周的第一天(通常以一年的第一个星期日为第一周的第一天):%U
  • 英国会议:一年中的一周为十进制数(00-53),使用星期一作为一周的第一天(通常以一年的第一个星期一为第一周的第一天):%W
  • ISO 8601定义:按ISO 8601中定义的十进制数(01-53)表示一年中的周。如果包含1月1日的一周(从星期一开始)在新的一年中有四天或更多天,那么它就被认为是第一周。否则,它是前一年的最后一周,下一周是第一周:%V,它在输入时被接受,但被忽略。 请注意,还有一个基于周的年份(%G%g),它将与%V一起使用,因为它可能与日历年(%Y%y)不同。

数字工作日

  • 工作日为十进制数(1-7,星期一为1):%u
  • 工作日为十进制数(0-6,星期日为0):%w
  • 有趣的是,没有任何形式的案件周日被计算为一周的第一天。

用不同的惯例来转换一年一周的日子。

如果我们将第一天附加到字符串中,并使用不同的格式,我们就会得到

代码语言:javascript
复制
as.Date("2015101", "%Y%U%u")
# [1] "2015-03-09"
as.Date("2015101", "%Y%U%w")
# [1] "2015-03-09"
as.Date("2015101", "%Y%W%u")
# [1] "2015-03-09"
as.Date("2015101", "%Y%W%w")
# [1] "2015-03-09"
as.Date("2015101", "%G%V%u")
# [1] NA

对于工作日格式%u%w,我们确实得到了相同的结果,因为在这两种约定中,第一天都是星期一(但是在处理星期日时要小心)。

对于2015年,美国和英国对年度周的定义是一致的,但并非所有年份都是如此,例如,2001、2007和2018年的情况并非如此:

代码语言:javascript
复制
as.Date("2018101", "%Y%U%u")
#[1] "2018-03-12"
as.Date("2018101", "%Y%W%u")
#[1] "2018-03-05"

输入不支持ISO 8601格式说明符。因此,几年前我创建了 package

代码语言:javascript
复制
ISOweek::ISOweek2date("2015-W10-1")
#[1] "2015-03-02"

编辑:使用星期四将一周与一个月联系起来

如前所述,您需要指定一周中的一天才能获得完整的日历日期。如果日期需要按月后进行汇总,也需要这样做。

如果没有指定工作日,如果日期应该按月后进行汇总,则可以将每周的星期四作为参考日(a suggestion by djhurio之后)。这将确保将整个星期分配给一周的大部分时间所属的月份。

例如,以星期日作为参考日将返回。

代码语言:javascript
复制
ISOweek::ISOweek2date("2015-W09-7")

1 "2015-03-01“

因此,将整个星期与3月联系在一起,尽管一周中只有一天属于3月,而其余6天属于2月。以星期四为参考日将返回二月的日期:

代码语言:javascript
复制
ISOweek::ISOweek2date("2015-W09-4")

1 "2015-02-26“

票数 63
EN

Stack Overflow用户

发布于 2019-01-10 11:07:53

是的,ISOweek包是这样做的

代码语言:javascript
复制
ISOweek::ISOweek2date(isoWeek)

但是对于另一个方向,也要检查更新的lubridate

代码语言:javascript
复制
ISOweek::date2ISOweek(yourDate)

lubridate::isoweek(ymd(yourDate))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45549449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档