2012-07-04 25 views
22

Tôi hiện đang chơi nhiều thứ với ngày và giờ cho gói tôi đang xây dựng.Làm tròn ngày POSIX (POSIXct) với chức năng cơ sở R

Stumbling qua số post nhắc tôi một lần nữa rằng nó thường không phải là một ý tưởng tồi để kiểm tra xem một cái gì đó có thể được thực hiện với các tính năng cơ bản R trước khi chuyển sang gói contrib.

Do đó, có thể làm tròn ngày của lớp POSIXct bằng chức năng cơ sở R?

Tôi đã kiểm tra

methods(round) 

mà "chỉ" đã cho tôi

[1] round.Date  round.timeDate* 

    Non-visible functions are asterisked 

Đây là những gì tôi muốn làm (Pseudo Mã)

x <- as.POSIXct(Sys.time()) 
[1] "2012-07-04 10:33:55 CEST" 

round(x, atom="minute") 
[1] "2012-07-04 10:34:00 CEST" 

round(x, atom="hour") 
[1] "2012-07-04 11:00:00 CEST" 

round(x, atom="day") 
[1] "2012-07-04 CEST" 

Tôi biết điều này có thể được thực hiện với timeDate, lubridate v.v., nhưng tôi muốn giữ phụ thuộc gói xuống. Vì vậy, trước khi đi trước và kiểm tra mã nguồn của các gói tương ứng, tôi nghĩ tôi sẽ hỏi nếu ai đó đã làm một cái gì đó như thế này.

Trả lời

34

baseround.POSIXt để thực hiện việc này. Không chắc chắn lý do tại sao nó không xuất hiện với methods.

x <- as.POSIXct(Sys.time()) 
x 
[1] "2012-07-04 10:01:08 BST" 
round(x,"mins") 
[1] "2012-07-04 10:01:00 BST" 
round(x,"hours") 
[1] "2012-07-04 10:00:00 BST" 
round(x,"days") 
[1] "2012-07-04" 
+0

chức năng tuyệt vời, nhưng kỳ lạ doesnt có tuần, tháng hoặc năm làm tròn; cho tình hình của tôi, tôi sẽ phải đi với @nzcoops câu trả lời – chepyle

12

Mở chủ đề này với lubridate, cũng nhìn vào ceiling_date()floor_date() chức năng:

x <- as.POSIXct("2009-08-03 12:01:59.23") 
ceiling_date(x, "second") 
# "2009-08-03 12:02:00 CDT" 
ceiling_date(x, "hour") 
# "2009-08-03 13:00:00 CDT" 
ceiling_date(x, "day") 
# "2009-08-04 CDT" 
ceiling_date(x, "week") 
# "2009-08-09 CDT" 
ceiling_date(x, "month") 
# "2009-09-01 CDT" 
+1

Tôi muốn làm tròn tháng có sẵn cho POSIXct, bởi vì floor_date là đau đớn chậm. –

Các vấn đề liên quan