Thời gian trích xuất từ ​​POSIXct


82

Làm cách nào để trích xuất thời gian từ một loạt các đối tượng POSIXct loại bỏ phần ngày tháng?

Ví dụ, tôi có:

times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979, 
1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059, 
1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct", 
"POSIXt"))

tương ứng với những ngày này:

"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET" 
"2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET" 
"2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET"
"2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET"
"2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"

Bây giờ, tôi có một số giá trị cho một thông số được đo tại những thời điểm đó

val <- c(1.25343125e-05, 0.00022890575, 
         3.9269125e-05, 0.0002285681875, 
         4.26353125e-05, 5.982625e-05, 
         2.09575e-05, 0.0001516951251, 
         2.653125e-05, 0.0001021391875)

Tôi muốn vẽ biểu đồ val so với thời gian trong ngày, không phân biệt ngày cụ thể khi đo val.

Có một chức năng cụ thể nào cho phép tôi làm điều đó không?

Câu trả lời:


115

Bạn có thể sử dụng strftimeđể chuyển đổi ngày giờ sang bất kỳ định dạng ký tự nào:

> t <- strftime(times, format="%H:%M:%S")
> t
 [1] "02:06:49" "03:37:07" "00:22:45" "00:24:35" "03:09:57" "03:10:41"
 [7] "05:05:57" "07:39:39" "06:47:56" "07:56:36"

Nhưng điều đó không giúp ích nhiều lắm, vì bạn muốn vẽ biểu đồ dữ liệu của mình. Một cách giải quyết là loại bỏ yếu tố ngày khỏi thời gian của bạn và sau đó thêm một ngày giống hệt nhau vào tất cả thời gian của bạn:

> xx <- as.POSIXct(t, format="%H:%M:%S")
> xx
 [1] "2012-03-23 02:06:49 GMT" "2012-03-23 03:37:07 GMT"
 [3] "2012-03-23 00:22:45 GMT" "2012-03-23 00:24:35 GMT"
 [5] "2012-03-23 03:09:57 GMT" "2012-03-23 03:10:41 GMT"
 [7] "2012-03-23 05:05:57 GMT" "2012-03-23 07:39:39 GMT"
 [9] "2012-03-23 06:47:56 GMT" "2012-03-23 07:56:36 GMT"

Bây giờ bạn có thể sử dụng các datetimeđối tượng này trong âm mưu của mình:

plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")

nhập mô tả hình ảnh ở đây


Để được trợ giúp thêm, hãy xem ?DateTimeClasses


15

Đã có những câu trả lời trước đó cho thấy thủ thuật. Về bản chất:

  • bạn phải giữ lại POSIXctcác loại để tận dụng tất cả các chức năng vẽ biểu đồ hiện có

  • nếu bạn muốn 'chồng' giá trị vài ngày trên một âm mưu duy nhất, làm nổi bật sự biến đổi trong ngày, thì mẹo hay nhất cũng là ...

  • áp đặt cùng một ngày (và tháng và thậm chí cả năm nếu cần, điều này không xảy ra ở đây)

mà bạn có thể thực hiện bằng cách ghi đè các thành phần ngày và tháng khi POSIXltbiểu diễn hoặc chỉ bằng cách bù trừ 'delta' so với 0:00:00 giữa các ngày khác nhau.

Vì vậy, với timesvalnhư helpfully do bạn cung cấp:

## impose month and day based on first obs
ntimes <- as.POSIXlt(times)    # convert to 'POSIX list type'
ntimes$mday <- ntimes[1]$mday  # and $mon if it differs too
ntimes <- as.POSIXct(ntimes)   # convert back

par(mfrow=c(2,1))
plot(times,val)   # old times
plot(ntimes,val)  # new times

mang lại điều này tương phản với thang thời gian ban đầu và đã sửa đổi:

nhập mô tả hình ảnh ở đây


9

Các data.tablegói có chức năng ' as.ITime', có thể làm điều này một cách hiệu quả sử dụng dưới đây:

library(data.table)
x <- "2012-03-07 03:06:49 CET"
as.IDate(x) # Output is "2012-03-07"
as.ITime(x) # Output is "03:06:49"

4

Tôi không thể tìm thấy bất kỳ thứ gì liên quan đến thời gian đồng hồ chính xác, vì vậy tôi chỉ sử dụng một số hàm từ package: lubridate và làm việc với giây-kể từ nửa đêm:

require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)

Sau đó, bạn có thể muốn xem một số mã trục để tìm ra cách gắn nhãn các trục một cách độc đáo.


Đẹp, tôi sẽ phải nhìn vào lubridate, có vẻ như một gói thú vị.
nico

4

Nhiều giải pháp đã được cung cấp, nhưng tôi chưa thấy giải pháp này, sử dụng gói chron:

hours = times(strftime(times, format="%T"))
plot(val~hours)

(xin lỗi, tôi không có quyền đăng hình ảnh, bạn sẽ phải tự vẽ nó)


3

Các time_tgiá trị cho nửa đêm giờ luôn chia hết cho 86400( 24 * 3600). Do đó, giá trị của giây kể từ nửa đêm GMT là như vậy time %% 86400.

Giờ theo GMT là (time %% 86400) / 3600và đây có thể được sử dụng làm trục x của biểu đồ:

plot((as.numeric(times) %% 86400)/3600, val)

nhập mô tả hình ảnh ở đây

Để điều chỉnh múi giờ, hãy điều chỉnh thời gian trước khi sử dụng mô-đun, bằng cách thêm số giây mà múi giờ của bạn đi trước GMT. Ví dụ: giờ tiết kiệm ánh sáng ban ngày ở trung tâm Hoa Kỳ (CDT) chậm hơn 5 giờ so với GMT. Để vẽ biểu đồ so với thời gian trong CDT, biểu thức sau được sử dụng:

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.