23

16Jun10 という形式の日付の列があり、ユリウス日を抽出したいと思います。いろいろな年があります。

関数 julian と mdy.date を試しましたが、うまくいかないようです。

4

5 に答える 5

29

characterクラス(つまり、テキスト)から クラス に変換するには、以下を試してからPOSIXlt、ユリウス日 ( yday) を抽出します。

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

機能設定の詳細については、次を参照してください。

?POSIXlt
?DateTimeClasses

もう 1 つのオプションは、Dateクラスを使用formatしてユリウス日を抽出することです (このクラスはユリウス日を 1:366 の間で定義し、POSIXlt は 0:365 であることに注意してください)。

tmp <- as.Date("16Jun10", format = "%d%b%y")
format(tmp, "%j")
# [1] "167"
于 2014-01-28T19:35:37.270 に答える
9

POSIXct をユリウス日番号 (JDN) に変換する機能を持つR のinsolパッケージを使用できます。JD(x, inverse=FALSE)

insolパッケージにはJDymd(year,month,day,hour=12,minute=0,sec=0)、カスタム日付用もあります。

ユリウス日 (JD) 全体を表示するには、おそらく設定する必要がありますoptions(digits=16)

于 2015-06-11T14:54:13.070 に答える
3
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 日に 1 に戻らないため、技術的には正しくありません。

http://en.wikipedia.org/wiki/Julian_day

以下の日付は序数の日付です。

   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
于 2014-11-20T11:46:15.553 に答える
3

以下は、元は APL で記述され、J に変換されたコードの R バージョンです。これを疑似ユリウス暦と呼んでいるのは、1582 年 10 月 15 日以降の日付のみを対象としているからです。1582 年 10 月 15 日は、西側諸国の一部で暦改革が恣意的に変更された日です。日付。

#* toJulian: convert 3-element c(Y,M,D) timestamp into pseudo-Julian day number.
toJulian<- function(TS3)
{   mm<- TS3[2]
    xx<- 0
    if( mm<=2) {xx<- 1}
    mm<- (12*xx)+mm
    yy<- TS3[1]-xx
    nc<- floor(0.01*yy)
    jd<- floor(365.25*yy)+floor(30.6001*(1+mm))+TS3[3]+1720995+(2-(nc-floor(0.25*nc)))
    return(jd)
#EG toJulian c(1959,5,24) -> 2436713
#EG toJulian c(1992,12,16) -> 2448973
}


逆関数は次のとおりです。

#* toGregorian: convert pseudo-Julian day number to timestamp in form c(Y,M,D)
# (>15 Oct 1582).  Adapted from "Numerical Recipes in C" by Press,
# Teukolsky, et al.
toGregorian<- function(jdn)
{   igreg<- 2299161       # Gregorian calendar conversion day c(1582,10,15).
    ja<- floor(jdn)
    xx<- 0
    if(igreg<=ja){xx<- 1}
    jalpha<- floor((floor((xx*ja)-1867216)-0.25)/36524.25)
    ja<- ((1-xx)*ja) + ((xx*ja)+1+jalpha-floor(0.25*jalpha))
    jb<- ja+1524
    jc<- floor(6680+((jb-2439870)-122.1)/365.25)
    jd<- floor(365.25*jc)
    je<- floor((jb-jd)/30.6001)
    id<- floor((jb-jd)-floor(30.6001*je))
    mm<- floor(je-1)
    if(12<mm){mm<- mm-12}
    iyyy<- floor(jc-4715)
    if(mm>2){iyyy<- iyyy-1}
    if(0>iyyy){iyyy<- iyyy-1}
    gd<- c(iyyy, mm, id)
    return(gd)
#EG toGregorian 2436713 -> c(1959,5,24)
#EG toGregorian 2448973 -> c(1992,12,16)
}
于 2018-09-19T14:23:32.703 に答える