Changeset 2477 in lmdz_wrf
- Timestamp:
- Apr 29, 2019, 4:27:12 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/generic_tools.py
r2476 r2477 551 551 ### 552 552 # 553 def fromanydate_CFYmd(date): 554 """ Function to transform from any string format of date to Y-m-d used in 555 CF-conventions 556 date: date to transform 557 >>> fromanydate_CFYmd('0001-01-01') 558 '0001-01-01' 559 >>> fromanydate_CFYmd('1850-1-1') 560 '1850-01-01' 561 >>> fromanydate_CFYmd('1850/1/1') 562 '1850-01-01' 563 >>> fromanydate_CFYmd('1976-02-17_08:32:27') 564 '1976-02-17' 565 """ 566 fname = 'fromanydate_CFYmd' 567 568 if date.count('-') + date.count('/') == 0 + date.count('.') == 0: 569 print errormsg 570 print ' ' + fname + ": date without either '-' or '/' or '.' not ready !!" 571 print " passed date '" + date + "' not manegeable" 572 quit(-1) 573 574 # Replacing '/', '.' by '-' 575 if date.count('/') != 0: date = date.replace('/','-') 576 if date.count('.') != 0: date = date.replace('.','-') 577 578 # Removing possible [datre]_[time] 579 if date.count('_') != 0: date = date.split('_')[0] 580 581 ldate = date.split('-') 582 if len(ldate) != 3: 583 print errormsg 584 print ' ' + fname + ": date '" + date + "' not ready !!" 585 print " it requires 3 '-' sections '[yr]-[mo]-[dd]'" 586 quit(-1) 587 588 yr = str(int(ldate[0])).zfill(4) 589 mo = str(int(ldate[1])).zfill(2) 590 dd = str(int(ldate[2])).zfill(2) 591 592 newdate = yr + '-' + mo + '-' + dd 593 594 return newdate 595 596 class CFtimeU_inf(object): 597 """ Classs to provide information of CFtime units 598 cftimeu: CF time units to provide information for [Timeu] since [RefDate] 599 * attributes: 600 refdate: reference date in Y-m-d H:M:S format 601 refdateYMHdms = reference date in YmdHMS format 602 refdatemat = reference date in matricial format 603 refdatejuliand = reference date as julian date (days since -4712 January 1st 604 00 UTC) 605 refdateDT = reference date as datetime object 606 Tunits = origtunits 607 utoweeks = Factor to convert values from original temporal units to weeks 608 utodays = Factor to convert values from original temporal units to days 609 utohours = Factor to convert values from original temporal units to hours 610 utominutes = Factor to convert values from original temporal units to minutes 611 utoseconds = Factor to convert values from original temporal units to seconds 612 """ 613 614 def __init__(self, cftimeu): 615 import datetime as dt 616 fname = 'CFtimeU_inf' 617 618 availtu = ['weeks', 'days', 'hours', 'minutes', 'seconds'] 619 620 origtv = cftimeu.split(' ') 621 origtunits = origtv[0] 622 origSrefdate0 = origtv[2] 623 624 origSrefdate = fromanydate_CFYmd(origSrefdate0) 625 626 yrref = int(origSrefdate[0:4]) 627 monref = int(origSrefdate[5:7]) 628 dayref = int(origSrefdate[8:10]) 629 630 # Does original reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS] 631 ## 632 trefT = cftimeu.find(':') 633 if not trefT == -1: 634 if len(origtv) == 3: 635 horref=int(origSrefdate[11:13]) 636 minref=int(origSrefdate[14:16]) 637 secref=int(origSrefdate[17:19]) 638 else: 639 origSreftime = origtv[3] 640 horref=int(origSreftime[0:2]) 641 minref=int(origSreftime[3:5]) 642 secref=int(origSreftime[6:8]) 643 else: 644 horref = 0 645 minref = 0 646 secref = 0 647 648 horrefS = str(horref).zfill(2) 649 minrefS = str(minref).zfill(2) 650 secrefS = str(secref).zfill(2) 651 652 # Transforming factors 653 if origtunits == 'weeks': 654 self.utoweeks = 1. 655 self.utodays = 7. 656 self.utohours = 7. * 24. 657 self.utominutes = 7. * 24. * 60. 658 self.utoseconds = 7. * 24. * 3600. 659 elif origtunits == 'days': 660 self.utoweeks = 1. / 7. 661 self.utodays = 1. 662 self.utohours = 24. 663 self.utominutes = 24. * 60. 664 self.utoseconds = 24. * 3600. 665 elif origtunits == 'hours': 666 self.utoweeks = 1. / ( 7. * 24.) 667 self.utodays = 1. / 24. 668 self.utohours = 1. 669 self.utominutes = 60. 670 self.utoseconds = 3600. 671 elif origtunits == 'minutes': 672 self.utoweeks = 1. / ( 7. * 24. * 60.) 673 self.utodays = 1. / ( 24. * 60.) 674 self.utohours = 1. / 60. 675 self.utominutes = 1. 676 self.utoseconds = 60. 677 elif origtunits == 'seconds': 678 self.utoweeks = 1. / ( 7. * 24. * 3600.) 679 self.utodays = 1. / ( 24. * 3600.) 680 self.utohours = 1. / 3600. 681 self.utominutes = 1. / 60. 682 self.utoseconds = 1. 683 else: 684 print errormsg 685 print ' ' + fname + ": new time-units '" + origtunits + "' not ready !!" 686 print ' available ones: ', availtu 687 quit(-1) 688 689 self.refdate = origSrefdate + ' ' + horrefS + ':' + minrefS + ':' + secrefS 690 self.refdateYMHdms = origSrefdate[0:4] + origSrefdate[5:7] + \ 691 origSrefdate[8:10] + horrefS + ':' + minrefS + ':' + secrefS 692 self.refdatemat = [yrref, monref, dayref, horref, minref, secref] 693 self.refdatejuliand = juliandate(yrref,monref,dayref,horref,minref,secref) 694 if yrref >= 1900: self.refdateDT = dt.datetime(yrref,monref,dayref,horref, \ 695 minref,secref) 696 else: self.refdateDT = None 697 698 self.Tunits = origtunits 699 700 553 701 def days_month(year,month): 554 702 """ Function to give the number of days of a month of a given year … … 16231 16379 # 'days since 1949-12-01 00:00:00') 16232 16380 16233 def fromanydate_CFYmd(date):16234 """ Function to transform from any string format of date to Y-m-d used in16235 CF-conventions16236 date: date to transform16237 >>> fromanydate_CFYmd('0001-01-01')16238 '0001-01-01'16239 >>> fromanydate_CFYmd('1850-1-1')16240 '1850-01-01'16241 >>> fromanydate_CFYmd('1850/1/1')16242 '1850-01-01'16243 >>> fromanydate_CFYmd('1976-02-17_08:32:27')16244 '1976-02-17'16245 """16246 fname = 'fromanydate_CFYmd'16247 16248 if date.count('-') + date.count('/') == 0 + date.count('.') == 0:16249 print errormsg16250 print ' ' + fname + ": date without either '-' or '/' or '.' not ready !!"16251 print " passed date '" + date + "' not manegeable"16252 quit(-1)16253 16254 # Replacing '/', '.' by '-'16255 if date.count('/') != 0: date = date.replace('/','-')16256 if date.count('.') != 0: date = date.replace('.','-')16257 16258 # Removing possible [datre]_[time]16259 if date.count('_') != 0: date = date.split('_')[0]16260 16261 ldate = date.split('-')16262 if len(ldate) != 3:16263 print errormsg16264 print ' ' + fname + ": date '" + date + "' not ready !!"16265 print " it requires 3 '-' sections '[yr]-[mo]-[dd]'"16266 quit(-1)16267 16268 yr = str(int(ldate[0])).zfill(4)16269 mo = str(int(ldate[1])).zfill(2)16270 dd = str(int(ldate[2])).zfill(2)16271 16272 newdate = yr + '-' + mo + '-' + dd16273 16274 return newdate16275 16381 16276 16382 def change_CFRefdate(timevals, origcftimeu, newSrefdate='1949-12-01 00:00:00'): … … 16291 16397 16292 16398 # original 16293 origtv = origcftimeu.split(' ') 16294 origtunits = origtv[0] 16295 origSrefdate0 = origtv[2] 16296 16297 origSrefdate = fromanydate_CFYmd(origSrefdate) 16298 16299 yrref = int(origSrefdate[0:4]) 16300 monref = int(origSrefdate[5:7]) 16301 dayref = int(origSrefdate[8:10]) 16399 inftunits = CFtimeU_inf(origcftimeu) 16400 origtunits = inftunits.Tunits 16401 origSrefdate = inftunits.refdate 16402 16403 [yrref, monref, dayref, horref, minref, secref]= inftunits.refdatemat 16302 16404 16303 16405 if int(yrref) < 1970: origsing = -1. 16304 16406 else: origsing = 1. 16305 16306 # Does original reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]16307 ##16308 trefT = origcftimeu.find(':')16309 if not trefT == -1:16310 if len(origtv) == 3:16311 horref=int(origSrefdate[11:13])16312 minref=int(origSrefdate[14:16])16313 secref=int(origSrefdate[17:19])16314 else:16315 origSreftime = origtv[3]16316 horref=int(origSreftime[0:2])16317 minref=int(origSreftime[3:5])16318 secref=int(origSreftime[6:8])16319 else:16320 horref = 016321 minref = 016322 secref = 016323 16407 16324 16408 # Transforming to julian days (reference -4712 January 1st 00 UTC) … … 16402 16486 16403 16487 # original 16404 origtv = origcftimeu.split(' ') 16405 origtunits = origtv[0] 16406 if len(origtv) == 4: 16407 origSrefdate = fromanydate_CFYmd(origtv[2]) + ' ' + origtv[3] 16408 else: 16409 print warnmsg 16410 print ' ' + fname + ": original time units wihout time !!" 16411 print " adding it as '00:00:00'" 16412 origSrefdate = fromanydate_CFYmd(origtv[2]) + ' 00:00:00' 16488 inftunits = CFtimeU_inf(origcftimeu) 16489 origtunits = inftunits.Tunits 16490 origSrefdate = inftunits.refdate 16413 16491 16414 16492 # From original to days … … 16458 16536 16459 16537 return newtimevals, newcftimeu 16460 16461 class CFtimeU_inf(object):16462 """ Classs to provide information of CFtime units16463 cftimeu: CF time units to provide information for [Timeu] since [RefDate]16464 * attributes:16465 refdate: reference date in Y-m-d H:M:S format16466 refdateYMHdms = reference date in YmdHMS format16467 refdatemat = reference date in matricial format16468 refdatejuliand = reference date as julian date (days since -4712 January 1st16469 00 UTC)16470 refdateDT = reference date as datetime object16471 Tunits = origtunits16472 utoweeks = Factor to convert values from original temporal units to weeks16473 utodays = Factor to convert values from original temporal units to days16474 utohours = Factor to convert values from original temporal units to hours16475 utominutes = Factor to convert values from original temporal units to minutes16476 utoseconds = Factor to convert values from original temporal units to seconds16477 """16478 16479 def __init__(self, cftimeu):16480 import datetime as dt16481 fname = 'CFtimeU_inf'16482 16483 availtu = ['weeks', 'days', 'hours', 'minutes', 'seconds']16484 16485 origtv = cftimeu.split(' ')16486 origtunits = origtv[0]16487 origSrefdate0 = origtv[2]16488 16489 origSrefdate = fromanydate_CFYmd(origSrefdate0)16490 16491 yrref = int(origSrefdate[0:4])16492 monref = int(origSrefdate[5:7])16493 dayref = int(origSrefdate[8:10])16494 16495 # Does original reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]16496 ##16497 trefT = cftimeu.find(':')16498 if not trefT == -1:16499 if len(origtv) == 3:16500 horref=int(origSrefdate[11:13])16501 minref=int(origSrefdate[14:16])16502 secref=int(origSrefdate[17:19])16503 else:16504 origSreftime = origtv[3]16505 horref=int(origSreftime[0:2])16506 minref=int(origSreftime[3:5])16507 secref=int(origSreftime[6:8])16508 else:16509 horref = 016510 minref = 016511 secref = 016512 16513 horrefS = str(horref).zfill(2)16514 minrefS = str(minref).zfill(2)16515 secrefS = str(secref).zfill(2)16516 16517 # Transforming factors16518 if origtunits == 'weeks':16519 self.utoweeks = 1.16520 self.utodays = 7.16521 self.utohours = 7. * 24.16522 self.utominutes = 7. * 24. * 60.16523 self.utoseconds = 7. * 24. * 3600.16524 elif origtunits == 'days':16525 self.utoweeks = 1. / 7.16526 self.utodays = 1.16527 self.utohours = 24.16528 self.utominutes = 24. * 60.16529 self.utoseconds = 24. * 3600.16530 elif origtunits == 'hours':16531 self.utoweeks = 1. / ( 7. * 24.)16532 self.utodays = 1. / 24.16533 self.utohours = 1.16534 self.utominutes = 60.16535 self.utoseconds = 3600.16536 elif origtunits == 'minutes':16537 self.utoweeks = 1. / ( 7. * 24. * 60.)16538 self.utodays = 1. / ( 24. * 60.)16539 self.utohours = 1. / 60.16540 self.utominutes = 1.16541 self.utoseconds = 60.16542 elif origtunits == 'seconds':16543 self.utoweeks = 1. / ( 7. * 24. * 3600.)16544 self.utodays = 1. / ( 24. * 3600.)16545 self.utohours = 1. / 3600.16546 self.utominutes = 1. / 60.16547 self.utoseconds = 1.16548 else:16549 print errormsg16550 print ' ' + fname + ": new time-units '" + origtunits + "' not ready !!"16551 print ' available ones: ', availtu16552 quit(-1)16553 16554 self.refdate = origSrefdate + ' ' + horrefS + ':' + minrefS + ':' + secrefS16555 self.refdateYMHdms = origSrefdate[0:4] + origSrefdate[5:7] + \16556 origSrefdate[8:10] + horrefS + ':' + minrefS + ':' + secrefS16557 self.refdatemat = [yrref, monref, dayref, horref, minref, secref]16558 self.refdatejuliand = juliandate(yrref,monref,dayref,horref,minref,secref)16559 if yrref >= 1900: self.refdateDT = dt.datetime(yrref,monref,dayref,horref, \16560 minref,secref)16561 else: self.refdateDT = None16562 16563 self.Tunits = origtunits16564 16538 16565 16539 def from360d_reg(tvals, tunits, kind='right'): … … 16712 16686 16713 16687 elif origcal == '3650d': 16714 # We only can fix the 12x30 days calendar for monthly values... 16688 print ' ' + fname + ": found non-standard calendar '" + origcal + "' !!" 16689 # We only can fix the 12x30 days calendar for monthly values... ? 16715 16690 if type(timevals) == type(range(2)) or type(timevals) == type(np.arange(2)): 16716 16691 dt = timevals[1] - timevals[0] … … 16718 16693 dt = 30. 16719 16694 # Transforming to regular months 16695 if newcal == 'gregorian' or newcal == 'standard': 16696 newtimevals = from360d_reg(tvals, tunits, kind='monpercen') 16720 16697 16721 16698 else:
Note: See TracChangeset
for help on using the changeset viewer.