python 中本地日期时间的儒略日数

Julian day number to local date-time in python

正在尝试将 Julian 日数转换为本地日期时间 python。如何实现?

juliandate = 2474706.5316357147
print (datetime.strptime(juliandate, '%Y%j').date())

    print (datetime.strptime(juliandate, '%Y%j').date())
TypeError: strptime() argument 1 must be str, not float

一种方便的方法是使用具有适当 originunit 的 pandas' to_datetime,例如

import pandas as pd

juliandate = 2459168.298
t = pd.to_datetime(juliandate, origin='julian', unit='D')
print(t)
# 2020-11-14 19:09:07.200000

# to python datetime:
# t.to_pydatetime().replace(tzinfo=timezone.utc)

或者如果你喜欢坚持使用标准库,你可以使用 timedelta。朱利安纪元,12h Jan 1 4713 BC,有点早,所以它有助于为更近的日期引入偏移量,例如

from datetime import datetime, timedelta, timezone

dt_Offset = 2400000.500 # 1858-11-17
dt = datetime(1858, 11, 17, tzinfo=timezone.utc) + timedelta(juliandate-dt_Offset)
print(dt)
# 2020-11-14 19:09:07.199996+00:00

另请参阅:julian day on wikipedia

请注意,这两个结果都是 UTC 时间。如果你想转换到某个时区,看看astimezone,例如

from zoneinfo import ZoneInfo
print(dt.astimezone(ZoneInfo('US/Eastern')))
# 2020-11-14 14:09:07.199996-05:00

# or my machine's local time (CET):
print(dt.astimezone())
# 2020-11-14 20:09:07.199996+01:00