2017-08-23 27 views
2

まず、再現可能な例を示します。私はフォーマットのようなユリウス暦での日が含まれているDOM列から日付を抽出する必要がr - data.tableでユリウス日付をカレンダー日付に変換する

> require(data.table) 

> x <- structure(list(DoM = c(2011241L, 2015359L, 2016352L, 2015360L, 
2015287L, 2014038L, 2017066L, 2012227L, 2015041L, 2015295L), 
Year = c(2011L, 2015L, 2016L, 2015L, 2015L, 2014L, 2017L, 
2012L, 2015L, 2015L), Month = c(8L, 12L, 12L, 12L, 10L, 2L, 
3L, 8L, 2L, 10L)), .Names = c("DoM", "Year", "Month"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame")) 

> x 
     DoM Year Month 
1: 2011241 2011  8 
2: 2015359 2015 12 
3: 2016352 2016 12 
4: 2015360 2015 12 
5: 2015287 2015 10 
6: 2014038 2014  2 
7: 2017066 2017  3 
8: 2012227 2012  8 
9: 2015041 2015  2 
10: 2015295 2015 10 

- 私は約20万行を取り扱っておりますので、私はdata.tableを使用しています。 DoM列の各要素の形式はyyyydddです。dddは、年の日であるyyyyです(したがって、1 <= ddd <= 366)。

例:それは私が現在私が持っているものに満足していないです2011

の241 ST日、に対応するため、最初の日付は2011-08-29だろう -

x[, Date:=as.Date((DoM-1000*Year)-1, origin=paste(Year,1,1,sep='-'))] 

私は疑いますpasteは非効率的で、より良い可能性のある代替案を探していました。

ありがとうございました!

答えて

3

これは基本的な書式設定で可能です。 ?strptimeを参照してください:

as.Date(as.character(x$DoM), format="%Y%j") 
# or as @Frank suggests, for integer dates in data.table: 
as.IDate(as.character(x$DoM), format="%Y%j") 
# [1] "2011-08-29" "2015-12-25" "2016-12-17" "2015-12-26" "2015-10-14" 
# [6] "2014-02-07" "2017-03-07" "2012-08-14" "2015-02-10" "2015-10-22" 
+4

かで動作するように速いかもしれ整数、日付、 'as.IDate(same_code複数)'のために。 – Frank

+0

私は 'as.IDate'を使って16倍のパフォーマンスを向上させました!ありがとう – Ameya

関連する問題