2016-06-08 28 views
5

Tôi không thể tìm ra cách để biến Sys.Date() thành một số trong định dạng YYYYDDD. Nơi DDD là ngày trong năm, tức là ngày 01 tháng 1 sẽ là 2.016.001 ngày 31 tháng 12 sẽ là 2016365Làm thế nào để chuyển đổi một ngày thành YYYYDDD?

Date <- Sys.Date() ## The Variable Date is created as 2016-01-01 
SomeFunction(Date) ## Returns 2016001 
+0

@ katya-handler Về cơ bản tất cả các định dạng khác (Ngày,) chức năng, đã không nhận ra% j tồn tại. Nếu những người khác tồn tại tôi muốn biết, đã tham khảo trang web này: [link] (http://www.statmethods.net/input/dates.html) – LanceS

+1

Phần 'định dạng' trong tài liệu của [' as.Date'] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/as.Date.html) liên kết đến tài liệu liên quan của ['strptime'] (https: //stat.ethz.ch/R-manual/R-devel/library/base/html/strptime.html) trong đó tất cả các thông số kỹ thuật chuyển đổi theo thời gian được liệt kê. – RHertel

Trả lời

6

Bạn chỉ có thể sử dụng chức năng format như sau:

format(Date, '%Y%j') 

mang đến cho:

[1] "2016161" "2016162" "2016163" 

Nếu bạn muốn định dạng nó theo những cách khác, xem ?strptime cho tất cả các tùy chọn có thể.

Ngoài ra, bạn có thể sử dụng yearyday chức năng từ data.table hoặc lubridate gói và dán chúng lại với nhau với paste0:

library(data.table) # or: library(lubridate) 
paste0(year(Date), yday(Date)) 

mà sẽ cung cấp cho bạn kết quả tương tự.


Giá trị được trả về bởi cả hai tùy chọn là ký tự lớp. Quấn các giải pháp trên vào as.numeric() để nhận số thực.


đã qua sử dụng dữ liệu:

> Date <- Sys.Date() + 1:3 
> Date 
[1] "2016-06-09" "2016-06-10" "2016-06-11" 
> class(Date) 
[1] "Date" 
+0

Rất đơn giản. Cảm ơn một tấn. – LanceS

+0

có thể là một câu hỏi sâu sắc hơn để giúp tôi tìm hiểu: Làm thế nào bạn biết rằng% j tồn tại? Tôi đã không đi qua điều này bất cứ nơi nào khác. – LanceS

+1

@LanceScadden Xem '? Strptime' – Jaap

1

này nên làm việc để tạo một cột mới với định dạng ngày được chỉ định:

Date <- Sys.Date  
df$Month_Yr <- format(as.Date(df$Date), "%Y%d") 

Nhưng, đặc biệt là khi làm việc với các tập dữ liệu lớn hơn, việc thực hiện những việc sau dễ dàng hơn:

library(data.table) 
setDT(df)[,NewDate := format(as.Date(Date), "%Y%d" 

Hy vọng điều này sẽ hữu ích. Có thể phải tinker nếu bạn chỉ muốn một giá trị và không làm việc với một tập hợp dữ liệu.

+1

@mtoto có câu trả lời hay, đơn giản nếu chỉ tìm kiếm giá trị cụ thể đó. –

3

Dưới đây là một lựa chọn với lubridate:

library(lubridate) 
x <- Sys.Date() 
#[1] "2016-06-08" 
paste0(year(x),yday(x)) 
#[1] "2016160" 
Các vấn đề liên quan