You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言中CSV多日度数据转时间序列时日期丢失问题求助

问题原因与解决方案

为什么ts()转换后日期信息丢失?

ts()函数生成的时间序列对象本质是靠「起始时间」和「频率」来定义时间维度的,它不会直接存储你原来的Vdate列这类日期时间戳。它会把你的数据按顺序排列,用内部的数值型时间索引(比如年份+小数表示一年中的位置)来标记,所以你看不到原来的日期信息是正常的。而且你设置的frequency=365只适合单日一条观测的日度数据,对于单日多条观测的情况,这个频率参数其实也不符合你的数据规律。

更适合的解决方案:用xts处理带时间戳的高频数据

对于单日包含多条观测的高频时间序列,推荐使用xts包(专门为带时间戳的时间序列设计),它能完美保留你的日期时间信息,操作也更灵活。

步骤1:安装并加载xts

install.packages("xts")  # 第一次使用需要安装
library(xts)

步骤2:创建xts时间序列对象

假设你的数据框vd里,除了V1Vdate,还有其他观测列(比如valuetemperature等),可以用下面的代码创建xts对象:

# 提取需要保留的观测列,用Vdate作为时间戳
vd.xts <- xts(
  x = vd[, !names(vd) %in% c("V1", "Vdate")],  # 排除不需要的列
  order.by = vd$Vdate  # 指定时间戳列
)

示例效果

如果你的数据是这样的:

# 模拟你的数据结构
vd <- data.frame(
  V1 = factor(c("2023-01-01 09:00", "2023-01-01 14:00", "2023-01-02 10:00")),
  value = c(12, 24, 18)
)
vd$Vdate <- as_datetime(vd$V1)

创建xts对象后,查看结果会看到完整的时间戳:

vd.xts
#                    value
# 2023-01-01 09:00:00    12
# 2023-01-01 14:00:00    24
# 2023-01-02 10:00:00    18

一定要用ts()的话(不推荐)

如果你坚持要用ts对象,需要先确认你的观测间隔是固定的(比如每天固定3次观测),然后调整frequency参数:

  • 假设单日有k条观测,那么年频率就是k*365
  • 同时需要指定start参数,比如第一条观测是2023年1月1日,那么start = c(2023, 1)

但这种方式的时间索引会是类似2023.0002023.0027这样的小数,可读性极差,远不如xts直观。


内容的提问来源于stack exchange,提问作者Tiitseri

火山引擎 最新活动