簡體   English   中英

R:如何按小時和分鍾過濾時間戳?

[英]R: how to filter a timestamp by hour and minute?

我正在為以下示例而苦苦掙扎

time = c('2013-01-03 21:59:21.549', '2013-01-04 22:00:21.549', '2013-01-05 22:01:21.222', '2013-01-06 22:06:23.559' )
value = c(1,2,3,4)

data <- data_frame(time, value)
data <-data %>%  mutate(time = ymd_hms(time))

> data
# A tibble: 4 × 2
                 time value
               <dttm> <dbl>
1 2013-01-03 21:59:21     1
2 2013-01-04 22:00:21     2
3 2013-01-05 22:01:21     3
4 2013-01-06 22:06:23     4

我怎樣才能寫一個dplyr::filter語句而不是每天只保留21:5922:01 (包括)之間的觀察結果?

在這里分別播放hour(time)minute(time)似乎不太好。

我在這里錯過了什么嗎?

預期輸出:僅第 1,2 和 3 行。 謝謝!

2019年來了! 這是使用as.hms的更好(更簡單)的解決方案。 tz參數是強制性的。

    time_str = c('2013-01-03 21:59:21.549', '2013-01-04 22:00:21.549', '2013-01-05 
    22:01:21.222', '2013-01-06 22:06:23.559' )
    value = c(1,2,3,4)
    data <- tibble(time_str, value)

    data %>%  mutate(timestamp_utc = ymd_hms(time_str, tz = 'UTC'),
                     timestamp_est = with_tz(timestamp_utc, 'America/New_York'),
                            time_est = as.hms(timestamp_est, tz = 'America/New_York')) %>% 
      filter(time_est >= hms::as.hms('16:59:00', tz = 'America/New_York'),
             time_est <= hms::as.hms('17:01:00', tz = 'America/New_York'))

會做這份工作

# A tibble: 2 x 5
  time_str                value timestamp_utc           timestamp_est           time_est 
  <chr>                   <dbl> <dttm>                  <dttm>                  <time>   
1 2013-01-03 21:59:21.549     1 2013-01-03 21:59:21.549 2013-01-03 16:59:21.549 16:59.549
2 2013-01-04 22:00:21.549     2 2013-01-04 22:00:21.549 2013-01-04 17:00:21.549 17:00.549

你提到lubridate hour和一minute不起作用,但不確定我明白為什么。 這不起作用嗎?

filter(data, 
    (hour(time) == 21 & minute(time) == 59) | 
    (hour(time) == 22 & minute(time) <= 1)
)

另一種方法是獲取一天中經過的秒數,並將其與對應於所需限制的秒數進行比較。 一天中經過的秒數計算為以一天中的秒數為模的總秒數: as.numeric(data$time) %% (60 * 60 * 24) 到(分鍾的開始)21:59 過去的秒數是60 * 60 * 21 + 60 * 59和到(分鍾的結束)22:01 的秒數是60 * 60 * 22 + 60 + 59 結合一切,

filter(data, between(as.numeric(time) %% (60 * 60 * 24),
                     60 * 60 * 21 + 60 * 59,
                     60 * 60 * 22 + 60 + 59
             )
 )

另一個想法如下。 您可以使用小時、分鍾和秒創建數字向量。 您可以使用format()提取它們並將字符轉換為數字。 然后,您使用指示所需時間范圍的兩個數字(即 215900、220100)對數據進行子集化。

library(dplyr)

data %>%
mutate(foo = as.numeric(format(time, "%H%M%S"))) %>%
filter(between(foo, 215900, 220100)) %>%
select(-foo)

#                 time value
#               <dttm> <dbl>
#1 2013-01-03 21:59:21     1
#2 2013-01-04 22:00:21     2

我想這可以解決您的問題:

library(dplyr) 

result <- data %>%  
  mutate(time2 = format(time, format="%H:%M:%S")) %>%
  filter(time2 >= "21:59:00" & time2 < "22:02:00") %>%
  select(-time2)

另一種過濾時間窗口的方法是將時間戳轉換為分鍾或秒(時間設置為 0000 - 2400),將其存儲在新變量中並使用新變量進行過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM