【问题标题】:Plotting truncated times from zoo time series从动物园时间序列中绘制截断时间
【发布时间】:2013-05-15 02:03:21
【问题描述】:

假设我在这些标题下有一个包含很多值的数据框:

df <- data.frame(c("Tid", "Value"))
#Tid.format = %Y-%m-%d %H:%M

然后我把那个数据框交给动物园,因为我想把它当作一个时间序列来处理:

library("zoo")
df <- zoo(df$Value, df$Tid)

现在我想生成一个平滑的散点图,在一天中的哪个时间进行每次测量(即丢弃日期信息并只保留时间),据推测应该这样做:https://stat.ethz.ch/pipermail/r-help/2009-March/191302.html

但似乎 time() 函数根本不产生任何时间;相反,它只是产生一个数字序列。无论我从该链接做什么,我都无法获得平均一天的值散点图。实际工作的 data.frame 代码(不使用动物园时间序列)如下所示(即从时间中提取小时并将其转换为数字):

smoothScatter(data.frame(as.numeric(format(df$Tid,"%H")),df$Value)

我想做的另一件事是生成我每小时测量次数的密度图。我已经使用常规 data.frame 绘制了几个小时没有问题,所以我拥有的数据很好。但是,当我尝试使用 zoo 时,我要么得到错误,要么在尝试通过谷歌找到的结果时得到错误的结果。

我确实设法通过这条线绘制了一些东西:

plot(density(as.numeric(trunc(time(df),"01:00:00"))))

但这是不正确的。它似乎再次生成了一个从 1 到 217 的序列,我希望它截断任何日期信息并将时间四舍五入到小时。

我可以绘制这个:

plot(density(df))

生成值的密度图。但我想要一个关于一天中每小时记录多少个值的密度图。

所以,如果有人可以帮我解决这个问题,那就太好了。总之,我想做的是:

1) smoothScatter(x-axis: time of day (0-24), y-axis: value)

2) 绘图(密度(x 轴:一天中的时间 (0-24)))

编辑:

library("zoo")
df <- data.frame(Tid=strptime(c("2011-01-14 12:00:00","2011-01-31 07:00:00","2011-02-05 09:36:00","2011-02-27 10:19:00"),"%Y-%m-%d %H:%M"),Values=c(50,52,51,52))
df <- zoo(df$Values,df$Tid)
summary(df)
df.hr <- aggregate(df, trunc(df, "hours"), mean)
summary(df.hr)
png("temp.png")
plot(df.hr)
dev.off()

此代码是我拥有的一些实际值。我原以为“df.hr”的图是每小时平均值,但我得到了一些奇怪的新索引,根本不是时间......

【问题讨论】:

  • 问题中的代码没有定义时间(zoo 的第二个参数被省略)所以它假定1:nrow(df) 是时间。你想要的动物园对象是zoo(df$value, df$Tid)read.zoo(df)
  • 啊哈,我加载数据不正确。谢谢。但我仍然无法得到满意的结果。如果我运行df.hr &lt;- aggregate(df, trunc(df, "01:00:00"), mean),那么我只会得到像99 90 87 88 89 91 92 86 85 84 83 78.60000 80.20000 81.23333 82.62500 83.30000 84.51818 85.35000 86.52353 87.46316 88.52162 89.50435 82 81 80 78 90.36047 91.20000 92.10000 99.90000 这样的十五个值,这与一天中的小时数完全不同......
  • 您需要提供可重现的内容。以目前的形式无法真正回答。
  • 我在末尾添加了一个代码 sn-p 可以说明我的问题。我截断小时后得到的索引与时间无关,所以情节看起来很遥远......

标签: r zoo


【解决方案1】:

题中的聚合语句存在三个问题:

  1. 我们希望截断时间而不是df

  2. trunc.POSIXt 不幸返回POSIXlt 结果,因此需要将其转换回POSIXct

  3. 看来您一开始并不打算截断到小时,而是想提取小时。

要解决前两点,aggregate 语句需要更改为:

tt <- as.POSIXct(trunc(time(df), "hours"))
aggregate(df, tt, mean)

但要解决最后一点,需要将其完全更改为

tt <- as.POSIXlt(time(df))$hour
aggregate(df, tt, mean)

【讨论】:

  • 啊哈,那么 99...80 值毕竟是时间格式吗?有趣的。有时让我感到难以置信的是,R 界面是多么不直观。但是我已经尝试了您的代码,其输出与完全没有截断的输出完全相同。日子还在那里;这不仅仅是几个小时。
  • 它确实截断为小时,但输入已经被截断为小时,所以当然,它不会改变它。您似乎希望提取小时而不是截断小时。我已添加到答案中。
  • 太好了,谢谢。似乎我需要更多地了解这种 POSIX 风格的日期格式...
猜你喜欢
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多