2014-01-28 132 views

回答

17

請嘗試以下方法從character類(即文本)轉換爲POSIXlt類,然後提取儒略日(yday):

tmp <- as.POSIXlt("16Jun10", format = "%d%b%y") 
tmp$yday 
# [1] 166 

更多細節功能設置:

?POSIXlt 
?DateTimeClasses 

另一個選項是使用Date類,然後使用format來提取朱連安日(請注意,此類定義的朱利安天數介於1:366之間,而POSIXlt爲0:365):

tmp <- as.Date("16Jun10", format = "%d%b%y") 
format(tmp, "%j") 
# [1] "167" 
+0

這個熱門的答案是關於_Day of Year/Ordinal date_和* not * about _ [Julian Date](https://en.wikipedia.org/wiki/Julian_day)_。朱利安日期是公元前4713年(!!)的日計數。爲什麼這個答案這麼多次upvoted ?. –

+0

參見[*術語*](https://en.wikipedia.org/wiki/Julian_day#Terminology)小節 - *「除了天文學,Julian日期也可以指日曆年的數字(更多正確的,順序的日期)格里曆,特別是在計算機編程...「*。我猜測程序員的票數超過了天文學家的票數。 –

+0

一個好的:)。請注意Andrei的答案如下。它實際上是計算天文學相關的儒略日期。還要注意,標籤朱連指的是與天文有關的含義。現在我投降.. –

14

同理:

require(lubridate) 
x = as.Date('2010-06-10') 
yday(x) 

[1] 161 

另外請注意,使用lubridate:

> dmy('16Jun10') 
[1] "2010-06-16 UTC" 
+0

你能幫我在2012/06/09(yyyy/mm/dd)上得到像112161這樣的儒略日期嗎? – emeralddove

2
my.data = read.table(text = " 
    OBS MONTH1 DAY1 YEAR1 
     1  3  1 2012 
     2  3 31 2012 
     3  4  1 2012 
     4  4 30 2012 
     5  5  1 2012 
     6  5 31 2012 
     7  6  1 2012 
     8  6 30 2012 
     9  7  1 2012 
     10  7 31 2012  
", header = TRUE, stringsAsFactors = FALSE) 

my.data$MY.DATE1 <- do.call(paste, list(my.data$MONTH1, my.data$DAY1, my.data$YEAR1)) 
my.data$MY.DATE1 <- as.Date(my.data$MY.DATE1, format=c("%m %d %Y")) 

my.data$my.julian.date <- as.numeric(format(my.data$MY.DATE1, "%j")) 
my.data 

回報,這在技術上是不正確,因爲朱利安日期不返回1,第一天每個1月份:

低於3210個

的日期順序日期:

OBS MONTH1 DAY1 YEAR1 MY.DATE1 my.julian.date 
1 1  3 1 2012 2012-03-01    61 
2 2  3 31 2012 2012-03-31    91 
3 3  4 1 2012 2012-04-01    92 
4 4  4 30 2012 2012-04-30   121 
5 5  5 1 2012 2012-05-01   122 
6 6  5 31 2012 2012-05-31   152 
7 7  6 1 2012 2012-06-01   153 
8 8  6 30 2012 2012-06-30   182 
9 9  7 1 2012 2012-07-01   183 
10 10  7 31 2012 2012-07-31   213 
2

均可以使用的insol包具有JD(x, inverse=FALSE)函數轉換POSIXct朱利安天數(JDN)。

insol包也有JDymd(year,month,day,hour=12,minute=0,sec=0)自定義日期。

要顯示整個儒略日期(JD),您可能必須設置options(digits=16)