9

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?

martineau
  • 119,623
  • 25
  • 170
  • 301
abidinberkay
  • 1,857
  • 4
  • 36
  • 68
  • 8
    Unrelated, but [Julian day](https://en.wikipedia.org/wiki/Julian_day) is a different animal : *Julian day is the continuous count of days since the beginning of the Julian Period used primarily by astronomers* – Serge Ballesta Jun 10 '16 at 10:22
  • 1
    the reverse operation: [Extract day of year and Julian day from a string date in python](http://stackoverflow.com/a/25831416/4279) – jfs Jun 10 '16 at 14:38

4 Answers4

20

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'
Brendan Abel
  • 35,343
  • 14
  • 88
  • 118
4

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

Yotam Salmon
  • 2,400
  • 22
  • 36
  • 1
    It is unneccessary to call the `str` function on an object if you're printing it. The `print` function will call the `__str__` method itself. Just this: `print(datetime.now())`, for example, is sufficient – illright Jun 10 '16 at 09:20
-1

Easy way

  • Convert from regular date to Julian date

print datetime.datetime.now().strftime("%y%j")

  • Convert from Julian date to regular date

print datetime.datetime.strptime('19155', '%y%j').strftime("%d-%m-%Y")

ush189
  • 1,342
  • 6
  • 22
  • 30
-1

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
rfkortekaas
  • 6,049
  • 2
  • 27
  • 34
stuartz
  • 121
  • 4
  • 9