"2012.11.07"
私はPythonで文字列を持っています。それを日付オブジェクトに変換してから、年の日の整数値とユリウス日の整数値を取得する必要があります。出来ますか?
9 に答える
datetime.datetime
まず、次のようにオブジェクトに変換できます。
>>> import datetime
>>> fmt = '%Y.%m.%d'
>>> s = '2012.11.07'
>>> dt = datetime.datetime.strptime(s, fmt)
>>> dt
datetime.datetime(2012, 11, 7, 0, 0)
次に、メソッドを使用してdatetime
必要なものを取得できます... ただし、datetime
必要な関数が直接ないため、時間タプルに変換する必要があります
>>> tt = dt.timetuple()
>>> tt.tm_yday
312
「ユリウス日」という用語には、いくつかの異なる意味があります。を探している場合2012312
は、間接的に行う必要があります。たとえば、次のいずれかです。
>>> int('%d%03d' % (tt.tm_year, tt.tm_yday))
2012312
>>> tt.tm_year * 1000 + tt.tm_yday
2012312
別の意味を探している場合は、ここから理解できるはずです。たとえば、「紀元前 4713 年 1 月 1 日からの日数」という意味が必要で、グレゴリオ暦の年と日を必要とする数式がある場合、プラグインする上記の 2 つの値があります。はグレゴリオ暦の年、月、日を使用するため、timetuple
ステップは必要ありません。) そこからどこへ行くべきか分からない場合は、詳細を尋ねてください。
数式を持っていない場合 (そしておそらく既に持っている場合でも)、おそらく最善の策は、既存のモジュールについて PyPI と ActiveState を調べることです。たとえば、クイック検索で と呼ばれるものが見つかりましたjdcal
。私はこれまで見たことがありませんでしたがpip install jdcal
、readme をざっと読んでみると、次のことができました。
>>> sum(jdcal.gcal2jd(dt.year, dt.month, dt.day))
2456238.5
これは、USNユリウス日コンバーターが私に与えたのと同じ結果です。
ユリウス日分数ではなく整数のユリウス日が必要な場合は、0 に向かって、負の無限大に向かって、正午を次の日に切り上げる、正午を偶数日に丸めるなど、どの方向に丸めるかを決定する必要があります。ユリウス日は、紀元前 4713 年 1 月 1 日の正午から始まると定義されているため、2012 年 11 月 7 日の半分は 2456238 であり、残りの半分は 2456239 であり、どちらが必要かはあなただけが知っています…) たとえば、0 に丸めるには:
>>> int(sum(jdcal.gcal2jd(dt.year, dt.month, dt.day)))
2456238
ユリウス日を取得するには、datetime.date.toordinal
メソッドを使用して固定オフセットを追加します。
ユリウス日は、先発ユリウス暦で紀元前 4713 年 1 月 1 日 12:00、または先発グレゴリオ暦で紀元前 4714 年 11 月 24 日 12:00 からの日数です。ユリウス日は真夜中ではなく正午に始まることに注意してください。
このtoordinal
関数は、先発グレゴリオ暦の紀元前 1 年 12 月 31 日 00:00 からの日数を返します (つまり、西暦 1 年 1 月 1 日 00:00 は、0 日目ではなく 1 日目の始まりです)。紀元前 1 年は西暦 1 年に直接先行することに注意してください。数字のゼロは何世紀も後まで発明されなかったため、0 年はありませんでした。
import datetime
datetime.date(1,1,1).toordinal()
# 1
toordinal
ユリウス日を取得するには、 の結果に 1721424.5 を加算するだけです。
別の回答では、開始した文字列を解析してオブジェクトに変換する方法をすでに説明していdatetime.date
ます。したがって、次のようにユリウス日を見つけることができます。
import datetime
my_date = datetime.date(2012,11,7) # time = 00:00:00
my_date.toordinal() + 1721424.5
# 2456238.5
abarnert の回答の最初の手順を簡素化するには、次のようにします。
from dateutil import parser
s = '2012.11.07'
dt = parser.parse(s)
次に、残りの abanert の回答を適用します。
この機能 (日付文字列のユリウス日付/時刻への変換) は、astropyモジュールにも存在します。詳細については、ドキュメントを参照してください。astropy の実装は、ユリウス日だけでなく、ユリウス時間への簡単な変換に特に便利です。
元の質問の解決例:
>>> import astropy.time
>>> import dateutil.parser
>>> dt = dateutil.parser.parse('2012.11.07')
>>> time = astropy.time.Time(dt)
>>> time.jd
2456238.5
>>> int(time.jd)
2456238
上記の例から、1 つのライナー (非ジュリアン) を次に示します。
import datetime
doy = datetime.datetime.strptime('2014-01-01', '%Y-%m-%d').timetuple().tm_yday
def JulianDate_to_date(y, jd):
month = 1
while jd - calendar.monthrange(y,month)[1] > 0 and month <= 12:
jd = jd - calendar.monthrange(y,month)[1]
month += 1
date = datetime.date(y,month,jd).strftime("%m/%d/%Y")
return date