【问题标题】:R: converting xts or zoo object to a data frameR:将 xts 或 zoo 对象转换为数据框
【发布时间】:2011-05-21 02:39:59
【问题描述】:

以结果数据是原始数据摘要的格式将时间序列数据强制转换为数据框的简单方法是什么?

这可能是一些示例数据,存储在 xts 或 zoo 对象中:

t,                  V1
"2010-12-03 12:00", 10.0
"2010-11-04 12:00", 10.0
"2010-10-05 12:00", 10.0
"2010-09-06 12:00", 10.0
...and so on, monthly data for many years.

我想将其转换为如下数据框:

year, month, V1
2010, 12,    a descriptive statistic calculated of that month's data
2010, 11,    ...
2010, 10,    ...
2010, 9,     ...

我问这个的原因是因为我想在同一个图中绘制每月计算的数据摘要。对于后一种格式的数据,我可以很容易地做到这一点,但还没有找到时间序列格式的绘图方法。

例如,我可以每天测量几年的温度数据,我想在同一个图中绘制每年的月平均温度曲线。我不知道如何使用 xts 格式的数据来做到这一点,或者这是否适合数据的 xts/zoo 格式的目的,它似乎总是带有年份信息。

【问题讨论】:

  • 您知道接受某些答案为“最佳答案”永远不会太晚

标签: r dataframe xts time-series


【解决方案1】:

请提供一个可以使用的数据样本,我会尽量提供一个不太笼统的答案。基本上,您可以使用apply.monthly 来计算您的 xts 对象的汇总统计信息。然后可以将索引转换为yearmon,并将xts对象转换为data.frame。

x <- xts(rnorm(50), Sys.Date()+1:50)
mthlySumm <- apply.monthly(x, mean)
index(mthlySumm) <- as.yearmon(index(mthlySumm))
Data <- as.data.frame(mthlySumm)

【讨论】:

  • 您可以使用format 提取年份和月份,如as.numeric(format(index(x), "%Y"))as.numeric(format(index(x), "%m")) 之类的行
  • 这些非常有帮助,谢谢。我缺少 index() 函数和 format() 函数。现在可以更轻松地使用我的数据了。
  • @user442446 如果它回答了您的问题,您应该接受它作为“最佳答案”。对于您提出的其他 5 个问题,您也应该这样做,因为您没有为任何问题标记任何“最佳答案”。
  • Joshua Ulrich 在stackoverflow.com/questions/14064097 上对类似的动物园/数据框转换问题给出了非常有用的答案,它具有示例数据和输出的优势。
【解决方案2】:

这是一个使用 tidyquant 包的解决方案,其中包括函数 as_xts() 用于将数据帧强制转换为 xts 对象,as_tibble() 用于将 xts 对象强制转换为小标题(“整洁”数据帧)。

重新创建数据:

> data_xts
           V1
2010-09-06 10
2010-10-05 10
2010-11-04 10
2010-12-03 10

使用as_tibble() 转换为小标题。 preserve_row_names = TRUE 添加了一个名为“row.names”的列,其中 xts 索引作为字符类。 renamemutate 用于清理日期。输出是一个带有日期和值的小标题。

> data_df <- data_xts %>%
     as_tibble(preserve_row_names = TRUE) %>%
     rename(date = row.names) %>%
     mutate(date = as_date(date))
> data_df
# A tibble: 4 × 2
        date    V1
      <date> <dbl>
1 2010-09-06    10
2 2010-10-05    10
3 2010-11-04    10
4 2010-12-03    10

您可以更进一步,使用mutate 函数添加其他字段,例如日、月和年。

> data_df %>%
     mutate(day   = day(date),
            month = month(date),
            year  = year(date))
# A tibble: 4 × 5
        date    V1   day month  year
      <date> <dbl> <int> <dbl> <dbl>
1 2010-09-06    10     6     9  2010
2 2010-10-05    10     5    10  2010
3 2010-11-04    10     4    11  2010
4 2010-12-03    10     3    12  2010

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 2016-01-07
    • 2023-03-14
    • 2017-04-21
    • 1970-01-01
    • 2017-12-24
    • 2016-04-08
    • 2011-05-16
    相关资源
    最近更新 更多