【问题标题】:R get difference per time-unitR 得到每个时间单位的差异
【发布时间】:2023-04-05 17:41:01
【问题描述】:

我是 R 新手,我想制作一些关于用电量的图表。我有几个大文件,包含时间戳和(累积)测量值。我想要三种类型的图表:

  • 一天中每小时的使用量
  • 一周中每天的使用量
  • 一年中每月的使用量

要做例如一天中每小时的使用量,我需要:

  • 获取每天每个小时的使用情况
  • 每天平均每小时

我掌握的数据如下:

2014-10-22 21:07:03+00:00,7432442.0
2014-10-22 21:07:21+00:00,7432443.0
2014-10-22 21:07:39+00:00,7432444.0
2014-10-22 21:07:57+00:00,7432445.0
2014-10-22 21:08:15+00:00,7432446.0
2014-10-22 21:08:33+00:00,7432447.0
2014-10-22 21:08:52+00:00,7432448.0
2014-10-22 21:09:10+00:00,7432449.0
2014-10-22 21:09:28+00:00,7432450.0

我能够加载数据并使用as.POSIXct() 解析时间戳。我也知道diff() 是为了有所作为。但是如何将其应用于整个数据表?

另外,中间时间的数据会怎样?例如:

2014-10-22 23:59:54+00:00,7433033.0
2014-10-23 00:00:12+00:00,7433034.0

在 22 日和 23 日之间使用了 1 个单位的东西。应该将其丢弃还是添加到其中一个?

【问题讨论】:

  • 我建议您查看 ?cut.POSIXt?seq.POSIXt 以了解将数据分组到时间段的方法。
  • 如果问题是 diff:data(mtcars) mtcars$diff = c(0, diff(mtcars$mpg))
  • 对不起;第二列是什么?当您说要绘制使用情况时,是第二列中表示的内容吗?

标签: r


【解决方案1】:

使用虚拟数据集

# sorted dataset
n = 1000
set.seed(1)
data = data.frame(
  time=seq(as.POSIXct('2014-10-22 21:07:00'),
           as.POSIXct('2014-10-23 10:07:00'),
           length.out=n),
  value=cumsum(runif(n))/n)

我们可以使用一天中的小时计算值的变化

# by hour of a day
starttime = as.POSIXct(format(min(data$time),'%Y-%m-%d'))
endtime = as.POSIXct(format(max(data$time),'%Y-%m-%d'))+60*60*24
hod = with(data,
           c(by(value,
              cut(time,seq(starttime,endtime,'hour')),
              function(x)x[length(x)]-x[1])))

然后通过做来绘制结果

# plot
plot(as.POSIXct(names(hod)), hod, type='l')
barplot(hod)

编辑

可以跨天聚合

# average across days of the total usage within each hour
hod_m = c(by(hod,
             format(as.POSIXct(names(hod)),'%H'),
             mean,na.rm=T))

您可以计算每天(每小时)内每次观察的“平均”使用量,而不是计算每天(每小时)内的总使用量

# average usage per observation within each hour of each day
au = with(data,
           c(by(value,
                cut(time,seq(starttime,endtime,'hour')),
                function(x)(x[length(x)]-x[1])/(length(x)-1))))

后面的每次观察的平均使用量可以使用

按天按小时聚合
# average across days of the above average usage within each day--hour
au_m = c(by(au,
            format(as.POSIXct(names(hod)),'%H'),
            mean,na.rm=T))

同样的,上面可以使用mean以外的聚合函数。

【讨论】:

  • 非常好!如何获取所有天的所有小时的平均值,然后将每天 1:00 到 1:59 的所有值取平均值?
  • 你可以试试c(by(hod,format(as.POSIXct(names(hod)),'%H'),mean,na.rm=T))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2018-03-31
相关资源
最近更新 更多