【问题标题】:How to filter a dataset by the time stamp如何按时间戳过滤数据集
【发布时间】:2016-06-19 16:50:35
【问题描述】:

我正在处理一些鸟类 GPS 跟踪数据,我想根据时间戳排除点。

一些背景信息 - GPS 记录器跟踪每只鸟仅超过 24 小时,从晚上开始,一直持续到晚上和第二天。我想做的是排除部署后当天晚上 9:30 之后获得的分数(因此从赛道的最末端删除分数)。 作为一个 R 新手,我很苦恼,因为每只鸟的部署日期都不同,所以我不能简单地将 subset() 用于特定的日期和时间。

我的数据框 (df) 示例:

BirdID    x             y           Datetime
15K12     492719.9      5634805     2015-06-23 18:25:00
15K12     492491.5      5635018     2015-06-23 18:27:00
15K70     455979.1      5653581     2015-06-24 19:54:00  
15K70     456040.9      5653668     2015-06-24 19:59:00

因此,假设这些点代表每只动物的 GPS 轨迹的开始,我想在 6 月 24 日晚上 9:30 之后删除鸟类 15K12 的点,以及 6 月 25 日晚上 9:30 之后的鸟类 15K70 的点。

有什么想法吗?

【问题讨论】:

  • 可能过度吸管,但df %>% group_by(BirdID) %>% filter(Datetime < (Datetime %>% min() %>% as.Date() %>% `+`(1) %>% paste('21:30:00') %>% as.POSIXct()))

标签: r dplyr subset


【解决方案1】:

首先,检查 df$Datetime 是否为日期变量:

class(df$Datetime)

如果不是,你可以这样转换:

df$Datetime <- ymd_hms(df&Datetime)

您使用 mutate 创建一个名为 newdate 的新变量,该变量获取鸟类数据的最早日期,并将截止日期设置为鸟类最早观测日期的第二天 21:30:00。

然后您通过 newdate 列过滤 Datetime 列,并获得比指定日期更早的观察结果。

library(dplyr); library(lubridate)
df %>% 
  group_by(BirdID) %>%
  mutate(newdate = as.POSIXct(date(min(Datetime)) + days(1) + hours(21) + minutes(30))) %>% 
  filter(Datetime < newdate)

做了一个可重现的例子:

library(dplyr); library(lubridate)

set.seed(1)

# Create a data frame (1000 observations)
BirdID <- paste(rep(floor(runif(250, 1, 20)),4),
  rep("k", 1000), rep(floor(runif(250, 1, 40)),4), sep = "")
x <- rnorm(1000, mean = 47000, sd = 2000)
y <- rnorm(1000, mean = 5650000, sd = 300000)
Datetime <- as.POSIXct(rnorm(1000, mean = as.numeric(as.POSIXct("2015-06-23 18:25:00")), sd = 99999), tz = "GMT", origin = "1970-01-01")
df <- data.frame(BirdID, x, y, Datetime, stringsAsFactors = FALSE)

# Filter the data frame by the specified date
df_filtered <- df %>% 
  group_by(BirdID) %>%
  mutate(newdate = as.POSIXct(date(min(Datetime)) + days(1) + hours(21) + minutes(30))) %>% 
  filter(Datetime < newdate)

这应该可以解决任何问题。

【讨论】:

  • 我不确定这是否能解决我的问题,因为我想保留跟踪开始当天 21:30 到 23:59 之间的分数。例如,如果跟踪在 6 月 23 日 18:00 开始,我想在 6 月 24 日 21:30 之后删除积分。
  • @Splash1199 我为您的特定要求修复了解决方案 :)
  • 感谢@toku_mo 第一步工作得很好。但是,当我尝试过滤 Datetime
  • @Splash1199 你是 Date (POSIXct) 类的 df$Datetime 列吗?如果是性格,那就不行了。如果它是字符,您可以转换该列。现在将编辑答案。
  • 是的,它们是 POSIXct。但是,我注意到 df$newdate 的时区是 UTC 而不是 PDT。我尝试像这样分配时区:df$newdate &lt;- ymd_hms(date(Datetime) + days(1) + hours(21) + minutes(30), tz="PDT") 但这不起作用
猜你喜欢
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2021-01-17
相关资源
最近更新 更多