Reputation: 2025
I have a string as Julian date like "16152"
meaning 152'nd day of 2016 or "15234"
meaning 234'th day of 2015.
How can I convert these Julian dates to format like 20/05/2016
using Python 3 standard library?
I can get the year 2016 like this: date = 20 + julian[0:1]
, where julian
is the string containing the Julian date, but how can I calculate the rest according to 1th of January?
Upvotes: 9
Views: 46057
Reputation: 131
I used this for changing a Juian date to xml xsd:datetime
def julianDate2ISO8601(d, offset='+00:00'):
"""
return ISO8601 formated datetime from julian date
optional offset [+|-]hh:mm
"""
d = str(d) # make sure it is a string
# replace leading number with correct century
centuryArray = ['19','20','21']
d = centuryArray[int(d[:1])] + d[1:]
# format string to iso 8601 datetime
return datetime.datetime.strptime(d, '%Y%j').date().strftime(
'%Y-%m-%dT00:00:00') + offset
Upvotes: -1
Reputation: 72
Easy way
print datetime.datetime.now().strftime("%y%j")
print datetime.datetime.strptime('19155', '%y%j').strftime("%d-%m-%Y")
Upvotes: -1
Reputation: 2411
Well, first, create a datetime
object (from the module datetime
)
from datetime import datetime
from datetime import timedelta
julian = ... # Your julian datetime
date = datetime.strptime("1/1/" + jul[:2], "%m/%d/%y")
# Just initializing the start date, which will be January 1st in the year of the Julian date (2 first chars)
Now add the days from the start date:
daysToAdd = int(julian[2:]) # Taking the days and converting to int
date += timedelta(days = daysToAdd - 1)
Now, you can just print it as is:
print(str(date))
Or you can use strftime()
function.
print(date.strftime("%d/%m/%y"))
Read more about strftime
format string here
Upvotes: 4
Reputation: 37549
The .strptime()
method supports the day of year format:
>>> import datetime
>>>
>>> datetime.datetime.strptime('16234', '%y%j').date()
datetime.date(2016, 8, 21)
And then you can use strftime()
to reformat the date
>>> date = datetime.date(2016, 8, 21)
>>> date.strftime('%d/%m/%Y')
'21/08/2016'
Upvotes: 20