Source code for NEDAS.models.topaz.time_format

from datetime import datetime, timedelta, timezone

[docs] def diy(iyr): if ( (iyr%4 == 0 and 1901+iyr%400==0) or (iyr % 4 != 0 )): days=365 else: days=366 return days
[docs] def forday(yrflag,dtime): # converts model day to "calendar" date (year,ordinal-day,hour). if (yrflag==0): # 360 days per model year, starting Jan 16 iyear = int((dtime+15.001)/360) + 1 iday = (dtime+15.001) % 360. + 1 ihour = ( ( dtime+15.001) % 360. + 1. - iday)*24. elif (yrflag==1): # 366 days per model year, starting Jan 16 iyear = int((dtime+15.001)/366.) + 1 iday = ( dtime+15.001 ) % 366. + 1 ihour = ( ( dtime+15.001 ) % 366. + 1. - iday)*24. elif (yrflag==2): # 366 days per model year, starting Jan 01 iyear = int((dtime+ 0.001)/366.) + 1. iday = ( dtime+ 0.001 ) % 366. + 1. ihour = ( ( dtime+ 0.001 ) % 366. + 1. - iday)*24. elif (yrflag==3): # model day is calendar days since 01/01/1901 iyr = int((dtime-1.)/365.25) nleap = iyr/4 dtim1 = 365.*iyr + nleap + 1. day = dtime - dtim1 + 1. if (dtim1>dtime): iyr = iyr - 1 elif (day>=367.): iyr = iyr + 1 elif ( (day>=366.) and (iyr % 4 != 3) ): iyr = iyr + 1 nleap = int(iyr/4) dtim1 = 365.*iyr + nleap + 1. iyear = 1901 + iyr iday = dtime - dtim1 + 1.001 ihour = (dtime - dtim1 + 1.001 - iday)*24 else: raise ValueError(f"unknown yrflag {yrflag}") return int(iyear), int(iday), int(ihour)
[docs] def dayfor(yrflag, iyear,iday,ihour): # converts "calendar" date (year,ordinal-day,hour) to model day if (yrflag==0): # 360 days per model year, starting Jan 16 dtime = (iyear-1) * 360. + iday + ihour/24. - 16. elif (yrflag==1): # 366 days per model year, starting Jan 16 dtime = (iyear-1) * 366. + iday + ihour/24.- 16. elif (yrflag==2): # 366 days per model year, starting Jan 01 dtime = (iyear-1) * 366. + iday - ihour/24. - 1. elif (yrflag==3): #model day is calendar days since 01/01/1901 iyr=iyear-1901 dtime=0. for k in range (iyr): dtime=dtime+diy(k+1901) iday2=iday while (iday2+ihour/24.>0.): iyr=iyr+1 diy2=diy(iyr+1901) if ((iday2+(ihour/24.))/diy2>=1.): dtime=dtime+diy2 else: dtime=dtime+iday2+ihour/24. iday2=iday2-diy2 else: raise ValueError(f"unknown yrflag {yrflag}") return dtime
[docs] def datetojul(t, refyear=1950, refmonth=1, refday=1): if t.tzinfo is None: t = t.replace(tzinfo=timezone.utc) ref_t = datetime(refyear, refmonth, refday, tzinfo=timezone.utc) jday = (t - ref_t) / timedelta(days=1) return jday
[docs] def jultodate(jday, refyear=1950, refmonth=1, refday=1): ref_t = datetime(refyear, refmonth, refday, tzinfo=timezone.utc) t = ref_t + jday * timedelta(days=1) return t