我需要转换几个"tibble"到"tsibble".
这里有一个简单的例子:
require(tidyverse)
require(lubridate)
time_1 <- c(ymd_hms('20210101 000000'),
ymd_hms('20210101 080000'),
ymd_hms('20210101 160000'),
# ymd_hms('20210102 000000'),
ymd_hms('20210102 080000'),
ymd_hms('20210102 160000'))
df_1 <- tibble(time_1, y=rnorm(5))
df_1 %>%
as_tsibble(index=time_1)
这段代码按预期工作。但是,如果日期都是午夜,这段代码抛出一个错误:
time_2 <- c(ymd_hms('20210101 000000'),
ymd_hms('20210102 000000'),
ymd_hms('20210103 000000'),
# ymd_hms('20210104 000000'),
ymd_hms('20210105 000000'),
ymd_hms('20210106 000000'))
df_2 <- tibble(time_2, y=rnorm(5))
df_2 %>%
as_tsibble(index=time_2)
我不想用这种方式解决这个问题,因为as.Date
函数改变了列类型。
df_2 %>%
mutate(time_2=as.Date(time_2)) %>%
as_tsibble(index=time_2)
我也不想以这种方式解决问题,因为在将tibble转换为表之后,我需要应用fill_gaps
函数,这不会在第二个场景中创建ymd_hms('20210104 000000')
。
df_2 %>%
as_tsibble(index=time_2, regular=FALSE)
这是一个bug吗?
谢谢。
此行为在table的FAQ中有解释。
基本上每天午夜测量的亚日数据(ymd_hms()
)不一定间隔1天(24小时)。考虑到有些日子由于您所在时区的夏令时而发生了变化,因此从午夜到第二天午夜之间的小时数可能是23或25小时。
如果您正在处理以每日间隔测量的数据,则应该使用具有ymd()
精度的日期。如果您愿意,可以使用as_datetime()
将其转换回日期时间。
我个人认为这应该不会产生错误,但是如果它产生错误会简单得多。这里合适的时间间隔可能是1小时或30分钟(或者在指定的时区中适合时区转换的任何时间)。