2010-11-02 29 views
7

Tôi cần chuyển đổi ngày (định dạng m/d/y) thành 3 cột riêng biệt mà tôi hy vọng chạy thuật toán. ngày của tôi vào số Julian Day). Đã thấy đề xuất này cho một người dùng khác để tách dữ liệu ra thành nhiều cột bằng cách sử dụng Oracle. Tôi đang sử dụng R và am bị mắc kẹt về cách mã này một cách thích hợp. Sẽ A1, A2 ... đại diện cho các tiêu đề cột mới của tôi và sự khác biệt về định dạng sẽ là gì với phần "bộ cập nhật"?Chia dữ liệu ngày (m/d/y) thành 3 cột riêng biệt

update <tablename> set A1 = substr(ORIG, 1, 4), 
         A2 = substr(ORIG, 5, 6), 
         A3 = substr(ORIG, 11, 6), 
         A4 = substr(ORIG, 17, 5); 

Tôi đang cố gắng hết sức để cải thiện kỹ năng của mình trong R nhưng không thể tìm được kỹ năng này ... bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn trước ... :)

Trả lời

9

Cho một biến văn bản x, như thế này:

> x 
[1] "10/3/2001" 

thì:

> as.Date(x,"%m/%d/%Y") 
[1] "2001-10-03" 

chuyển đổi nó thành đối tượng ngày. Sau đó, nếu bạn cần:

> julian(as.Date(x,"%m/%d/%Y")) 
[1] 11598 
attr(,"origin") 
[1] "1970-01-01" 

cung cấp cho bạn ngày Julian (tương đối 1970-01-01).

Đừng thử điều con chuỗi ...

Xem trợ giúp (as.Date) để biết thêm.

6

nhanh những:

  1. Julian ngày chuyển đổi đã tồn tại trong cơ sở R, xem ví dụ help(julian).

  2. Một cách tiếp cận có thể là phân tích ngày làm POSIXlt và sau đó đọc các thành phần. Các lớp và gói ngày/giờ khác cũng sẽ hoạt động nhưng có điều gì đó cần phải nói cho cơ sở R.

  3. Ngày phân tích cú pháp là chuỗi luôn luôn là một cách tiếp cận xấu.

Dưới đây là một ví dụ:

datetxt <- c("2010-01-02", "2010-02-03", "2010-09-10") 
dates <- as.Date(datetxt) ## you could examine these as well 
plt <- as.POSIXlt(dates) ## now as POSIXlt types 
plt[["year"]] + 1900  ## years are with offset 1900 
#[1] 2010 2010 2010 
plt[["mon"]] + 1   ## and months are on the 0 .. 11 intervasl 
#[1] 1 2 9 
plt[["mday"]] 
#[1] 2 3 10 
df <- data.frame(year=plt[["year"]] + 1900, 
        month=plt[["mon"]] + 1, day=plt[["mday"]]) 
df 
# year month day 
#1 2010  1 2 
#2 2010  2 3 
#3 2010  9 10 

Và tất nhiên

julian(dates) 
#[1] 14611 14643 14862 
#attr(,"origin") 
#[1] "1970-01-01" 
+0

Để đọc dễ dàng hơn, tháng càng đẹp hơn 'month.name [plt [[" mon "]] + 1]' –

+1

Chắc chắn, nhưng OP muốn số cho chuyển đổi Julian ... –

18

tôi sử dụng phương pháp format() cho Date đối tượng để tháo ngày trong R. Sử dụng Dirk của datetext, đây là cách tôi sẽ đi về phá vỡ một ngày thành nhiều phần cấu thành của nó:

datetxt <- c("2010-01-02", "2010-02-03", "2010-09-10") 
datetxt <- as.Date(datetxt) 
df <- data.frame(date = datetxt, 
       year = as.numeric(format(datetxt, format = "%Y")), 
       month = as.numeric(format(datetxt, format = "%m")), 
       day = as.numeric(format(datetxt, format = "%d"))) 

Mà cho:

> df 
     date year month day 
1 2010-01-02 2010  1 2 
2 2010-02-03 2010  2 3 
3 2010-09-10 2010  9 10 

Lưu ý những gì người khác đã nói; bạn có thể nhận được ngày Julian mà không tách ra các thành phần ngày khác nhau. Tôi đã thêm câu trả lời này để cho thấy làm thế nào bạn có thể làm việc phá vỡ nếu bạn cần nó cho cái gì khác.

1

Hi Gavin: một cách khác [sử dụng ý tưởng của bạn] là:

Dữ liệu-frame chúng tôi sẽ sử dụng là oilstocks trong đó có nhiều biến liên quan đến những thay đổi theo thời gian của các cổ phiếu dầu khí. Các biến là:

colnames(stocks) 
"bpV" "bpO" "bpC" "bpMN" "bpMX" "emdate" "emV" "emO" "emC" 
"emMN" "emMN.1" "chdate" "chV" "cbO" "chC" "chMN" "chMX" 

Một trong những điều đầu tiên cần làm là thay đổi lĩnh vực emdate, mà là một vector số nguyên, vào một vector ngày.

Tiếp theo, chúng tôi muốn chia cột emdate thành ba cột riêng biệt đại diện cho tháng, ngày và năm bằng ý tưởng do bạn cung cấp.

> dfdate <- data.frame(date=realdate) 
year=as.numeric (format(realdate,"%Y")) 
month=as.numeric (format(realdate,"%m")) 
day=as.numeric (format(realdate,"%d")) 

ls() sẽ bao gồm các vectơ riêng lẻ, ngày, tháng, năm và dfdate. Bây giờ hợp nhất dfdate, ngày, tháng, năm vào khung dữ liệu gốc [cổ phiếu].

ostocks<-cbind(dfdate,day,month,year,stocks) 
colnames(ostocks) 

"date" "day" "month" "year" "bpV" "bpO" "bpC" "bpMN" "bpMX" "emdate" "emV" "emO" "emC" "emMN" "emMX" "chdate" "chV" 
"cbO" "chC" "chMN" "chMX" 

Kết quả tương tự và tôi cũng có ngày, tháng, năm là các vectơ riêng biệt bên ngoài df.

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