【问题标题】:Extract intervals from time data in R从R中的时间数据中提取间隔
【发布时间】:2014-08-27 23:27:38
【问题描述】:

我的问题很简单。我有表格,其中每一行都是事件(给出了月、日、小时、分钟)。但是,机器设置为 24/7。所以我有比我需要的更多的事件(行)。 如何从白天删除多余的行,从晚上(从日落到日出)只保留行? 可怕的是,日出/日落的时间每天都略有不同

在这个例子中,我提供了两个表格。第一个是包含所有事件的表格,第二个包含每天的日落/日出时间。

如果可以提取,请注意每个夜晚由两个日期组成 可能是插入到包含夜晚 ID 的表中的附加列? (见下面的方案)

# table with all events
my.table <- data.frame(event = 1:34,
                       day = rep(c(30,31,1,2,3), times = c(8,9,7,8,2)),
                       month = rep(c(3,4), each = 17),
                       hour = c(13,13,13,13,22,
                                22,23,23,2,2,2,
                                14,14,14,19,22,22,
                                2,2,2,14,15,22,22,
                                3,3,3,14,14,14,
                                23,23,2,14),
                       minute = c(11,13,44,55,27,
                                  32,54,57,10,14,
                                  26,12,16,46,30,
                                  12,13,14,16,45,
                                  12,15,12,15,24,
                                  26,28,12,16,23,12,13,11,11))


# timings of sunset/sunrise for each day
sun.table <- data.frame(day = c(30,31,31,1,1,2,2,3),
                        month = rep(c(3,4), times = c(3,5)),
                        hour = rep(c(19,6), times = 4),
                        minute = c(30,30,31,29,32,
                                   28,33,27),
                        type = rep(c("sunset","sunrise"), times = 4))

# rigth solution reduced table would contain only rows:
# 5,6,7,8,9,10,11,16,17,18,19,20,23,24,25,26,27,31,32,33.
# nrow("reduced table") == 20

【问题讨论】:

  • my.table 应该有一个小时专栏吗?
  • sun.table中的每一天是否也应该有日出和日落?
  • 嗯,不一定。机器在接近傍晚前的第一天开始录制(第一天只有日落)并在晚上结束录制(最后一天只有日出)。 “中间”的所有日子都有“日落”和“日出”时间。如果你愿意,我可以添加时间,这样它们总是每天两个,或者 zou 可以只对上面表格中的两个时间进行子集。如果这样的程序将简化提取过程,是否排除几天并不重要。
  • 第一天(29日)日出

标签: r datetime dataframe intervals extraction


【解决方案1】:

这是一种可能的策略

#convert sun-up, sun-down times to proper dates
ss <- with(sun.table, ISOdate(2000,month,day,hour,minute))
up <- ss[seq(1,length(ss),by=2)]
down <- ss[seq(2,length(ss),by=2)]

这里我假设这张桌子是有序的,从日出开始,来回交替,以日落结束。日期值也需要一年,在这里我只是硬编码了 2000。只要您的数据不跨越年份(或闰日)应该没问题,但您可能希望在实际观察年份中弹出。

现在对事件做同样的事情

tt <- with(my.table, ISOdate(2000,month,day,hour,minute))

查找白天的行

daytime <- sapply(tt, function(x) any(up<x & x<down))

并提取这些行

my.table[daytime, ]

#    event day month hour minute
# 5      5  30     3   22     27
# 6      6  30     3   22     32
# 7      7  30     3   23     54
# 8      8  30     3   23     57
# 9      9  31     3    2     10
# 10    10  31     3    2     14
# 11    11  31     3    2     26
# 16    16  31     3   22     12
# 17    17  31     3   22     13
# 18    18   1     4    2     14
# 19    19   1     4    2     16
# 20    20   1     4    2     45
# 23    23   1     4   22     12
# 24    24   1     4   22     15
# 25    25   2     4    3     24
# 26    26   2     4    3     26
# 27    27   2     4    3     28
# 31    31   2     4   23     12
# 32    32   2     4   23     13
# 33    33   3     4    2     11

这里我们只获取日出之后和日落之前的值。由于sun.table 中没有足够的信息来确保第 34 行确实发生在子集之前,因此不会返回。

【讨论】:

  • 谢谢@MrFlick!价值观真的很奇怪——它们完全是捏造的。我原来的表有超过 100 000 行,我会试试这个程序。那么指示夜晚 ID 的列呢?
  • 哦,一个日期需要一年,所以在这里我只是硬编码了 2000。您可能应该将其更改为您观察的实际年份。
  • 亲爱的@MrFlick。我很害怕你的回答不适合我的问题。我做了一些更新。如果您仍然感兴趣,请查看它。我也设置了赏金。
  • @LadislavNado 我已经更新了我的答案以匹配您想要的输出。第一次这样做会让事情变得更容易。
猜你喜欢
  • 2019-05-18
  • 2018-07-21
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多