使用tsibble的yearmonth输入日期为何返回上月结果?
问题:tsibble包中yearmonth()处理日期字符串返回上月结果,与make_yearmonth()结果不一致
我在使用tsibble包创建“2016 Jan”的yearmonth对象时,发现输入日期字符串后返回的是上月结果,示例如下:
> yearmonth("2016 Jan") <yearmonth[1]> [1] "2015 Dec" > yearmonth("2016 Feb") <yearmonth[1]> [1] "2016 Jan"
但使用make_yearmonth函数却能得到预期结果,且用yearmonth验证也正常:
> ym <- make_yearmonth(year=2016, month=1) > ym <yearmonth[1]> [1] "2016 Jan" > yearmonth(ym) <yearmonth[1]> [1] "2016 Jan"
想请教为何直接输入日期字符串调用yearmonth与使用make_yearmonth的结果不同?
解答
这个差异的核心原因在于yearmonth()处理字符串时的底层解析逻辑:
yearmonth()对字符串的解析依赖基础日期转换:
当传入"2016 Jan"这类字符串时,yearmonth()会先将其转换为该月的第一天(即2016-01-01),再转换为yearmonth类型。如果你的系统时区是UTC以西的时区(比如美洲时区),2016-01-01在UTC时区下实际是2015-12-31,yearmonth()基于UTC日期值生成结果,最终显示为2015 Dec。make_yearmonth()直接构造yearmonth对象:
make_yearmonth()通过传入的year和month参数直接构建yearmonth对象,跳过了字符串转具体日期的步骤,不会触发时区导致的日期偏移,因此能得到预期的2016 Jan。验证时区影响的方法:
显式指定UTC时区解析字符串,即可得到正确结果:yearmonth("2016 Jan", tz = "UTC")
内容的提问来源于stack exchange,提问作者Chrispresso
相关产品推荐
相关产品推荐

