根据日期在 R 中对数据框进行子集

机器算法验证 时间序列 r
2022-04-05 18:33:26

我有一个具有非常简单的类似日志文件的结构的数据集,我想根据日期范围对数据进行子集化,但只能在一个参数上执行。

我的数据如下所示:

            date_time loc_id node  energy   kgco2 
1 2009-02-27 00:11:08     87  103 0.00000 0.00000 
2 2009-02-27 01:05:05     87  103 7.00000 3.75900 
3 2009-02-27 02:05:05     87  103 6.40039 3.43701 
4 2009-02-27 03:05:05     87  103 4.79883 2.57697 
5 2009-02-27 04:05:05     87  103 4.10156 2.20254 
6 2009-02-27 05:05:05     87  103 2.59961 1.39599

该文件包含一整年的数据,我想为每个月甚至每周创建摘要图

我正在处理 date_time 如下:

> dt <-as.POSIXlt(ae$date_time)
> ae$dt <- dt
> names(ae$dt)
[1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"

现在我正在尝试将数据子集为:

> x <- ae$energy[ae$dt$year=="110" & ae$dt$mon=="10"]
> x
numeric(0)

“110”是因为以下原因:

> range(ae$dt$year)
[1] 109 110

我也试过以下没有运气:

> d <- subset(ae, (dt$year=="110" & dt$mon=="10"), select=energy)

但是这些确实有效:

> d <- subset(ae, dt$year=="110", select=energy)

这也是

> d <- subset(ae, dt$mon=="10", select=energy)

关于如何通过选择年份和月份来进行子集化的任何想法?

谢谢,

2个回答

好的时间序列似乎已经成功了:

aets <- as.xts(read.zoo("n8_energy_actual2009_2010.csv", header=TRUE, sep=",", FUN=as.POSIXct))
eats.2010 <- aets["2010-01::2010-10"]

几点:

  1. 我不确定为什么会这样。显然 POSIXlt 插槽是错误的。除非我绝对需要调整插槽,否则我通常使用 POSIXct。
  2. 一种选择是直接使用日期而不是弄乱插槽,并说<=>=子集。就像是ae[ae$date >= as.POSIXlt("2009-10-01") & ae$date < as.POSIXlt("2009-11-01"),]
  3. 您应该考虑为此使用时间序列,因为这是该数据结构的确切目的(并且它们提供了许多有用的函数来处理随时间变化的数据)。最常见的一种是zoo. xts还包括许多可以帮助解决此类问题的功能。