m0n0lithic

xpat04.py

Oct 6th, 2017
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 30.06 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import lxml.html as LH
  4. from requests.adapters import HTTPAdapter
  5. from requests.packages.urllib3.poolmanager import PoolManager
  6. #import ssl
  7.  
  8. #class MyAdapter(HTTPAdapter):
  9. #  def init_poolmanager(self,connections,maxsize,block=False):
  10. #    self.poolmanager = PoolManager(num_pools=connections,
  11. #                                       maxsize=maxsize,
  12. #                                       block=block,
  13. #                                       ssl_version=ssl.PROTOCOL_TLSv1)
  14.  
  15.  
  16. import requests
  17. import pandas as pd
  18. from re import compile,search
  19. from datetime import datetime, timedelta
  20. from time import strptime,localtime,mktime,strftime
  21. # from datetime import datetime
  22. from sys import argv
  23. import MySQLdb
  24.  
  25. def text(elt):
  26.     elt1 = elt.text_content()
  27.     elt2 = elt1.replace(u'\xa0', u' ')
  28.     elt3 = elt2.replace(u'\xb0', u'')
  29.     elt3 = elt3.replace(u'\u2191 ', u'')
  30.     #return elt.text_content().replace(u'\xa0', u' ')
  31.     return elt3
  32.  
  33. urlsunm = 'http://www.timeanddate.com/sun/colombia/'
  34. urlmoom = 'http://www.timeanddate.com/moon/colombia/'
  35. urlmood = 'http://www.timeanddate.com/astronomy/colombia/'
  36.  
  37.  
  38. cities = {'cartagena':['FNC Sur','FN Caribe Sur'],\
  39.            'barranquilla':['FNC Centro','FN Caribe Centro'],\
  40.            'santa-marta':['FNC Norte','FN Caribe Norte'],\
  41.            'san-andres':['San Andres','Providencia','Norte de SAI'],\
  42.            'buenaventura':['Bahia Solano','Buenaventura','Tumaco','Area M 1 FNP','Area M 2 FNP','Area M 3 FNP'],\
  43.            'mitu':['Orinoquia1','Orinoquia2','Orinoquia3','Orinoquia4','Orinoquia5','Orinoquia6'],\
  44.            'villavicencio':['Oriente1','Oriente2','Oriente3'],\
  45.            'florencia':['Sur1','Sur2','Sur3']}
  46.  
  47. gfscit = {'Providencia':1,'San Andres':2,'FN Caribe Norte':3,\
  48.           'FN Caribe Centro':4,'FN Caribe Sur':5,'Norte de SAI':6,\
  49.           'FNC Centro':7,'FNC Sur':8,'FNC Sur':9,'Oriente1':10,\
  50.           'Oriente2':11,'Oriente3':12,'Orinoquia1':13,'Orinoquia2':14,\
  51.           'Orinoquia3':15,'Sur1':16,'Sur2':17,'Sur3':18,\
  52.           'Bahia Solano':22,'Buenaventura':23,'Tumaco':24,\
  53.           'San Felipe':25,'Puerto Narino':26, 'Arauquita':27}
  54.  
  55. proxies = {
  56.   'http': 'http://172.25.19.11:3128',
  57.   'https': 'http://172.25.19.11:3128',
  58. }
  59.  
  60.  
  61. #Fecha actual
  62. HORA_SYS = localtime()
  63. #HORA_SYS = localtime(mktime((HORA_SYS[0],HORA_SYS[1],HORA_SYS[2]-12,0,0,0,0,0,0))) #fecha de ayer
  64. ANODEFA = HORA_SYS[0]
  65. MESDEFA = HORA_SYS[1]
  66. DIADEFA = HORA_SYS[2]
  67.  
  68. def srchInd(units,gfsidx):
  69.   #A partir del codigo de referencia gfsidx busca su codigo en unit
  70.   res_ = filter(lambda ind: ind['gfsp'] == gfsidx, units)
  71.   return res_[0]['ind'],res_[0]['tipo']   #Unidad,Tipo
  72.   # return res_[0]['ind'] #Retorna codigo principal asociado a la BD
  73.  
  74. def getUAbrv(unidcurs):
  75.   cabrev = {}
  76.   #print cities.keys()
  77.   for i,city in enumerate(cities.keys()): #ciudad
  78.     #print cities[city]
  79.     abrev =[]
  80.     for j in range(len(cities[city])): #descripcion
  81.       res_ = filter(lambda abrev: abrev['descr'] == cities[city][j], unidcurs)
  82.       abrev.append((res_[0]['abrev'],res_[0]['ind']))   #Guarda Abreviatura e indice interno de referencia
  83.     cabrev[city] = abrev
  84.       #print cities[city][j], res_
  85.     #cabrev=dict(city=abrev)
  86.     #cabrev{cities[city]}.append(abrev)
  87.   return cabrev   #Retorna diccionario con la info de city,abrev
  88.  
  89.  
  90. def unitID(unidcurs,unidad):
  91.   # encuentra el indice corresp a la unidad
  92.   # http://stackoverflow.com/questions/1580270/whats-the-best-way-to-search-for-a-python-dictionary-value-in-a-list-of-diction
  93.   if any(d['abrev'] == unidad for d in unidcurs):
  94.     # Obtenga el ID correspondiente a la unidad consultada
  95.     res_ = filter(lambda unit: unit['abrev'] == unidad, unidcurs)
  96.     return res_[0]['ind']
  97.   else: return None   #No encontro resultado
  98.  
  99. def sunM(BD,unidads,cabrev):
  100. # BD: conex. Base de datos COMET
  101. # lista de tabla UNIDAD, lista
  102.   #print cabrev.keys()
  103.   for ct,k in enumerate(cabrev.keys()):
  104.     #print ct,k
  105.     print urlsunm+k
  106.     # Sun Data (monthly)
  107.     # url = 'http://www.timeanddate.com/sun/colombia/cartagena'
  108.     r = requests.get(urlsunm+k,proxies=proxies)
  109.     root = LH.fromstring(r.content)
  110.     #root = LH.fromstring(r.text)
  111.  
  112.     for table in root.xpath('//table[@id="as-monthsun"]'):
  113.       header = [text(th) for th in table.xpath('//th')]
  114.       data1 = [[text(td) for td in tr.xpath('td')]
  115.               for tr in table.xpath('//tr')]
  116.       #data = [row for row in data if len(row)==len(header)]
  117.  
  118.     year = header[0]
  119.     month = header[7]
  120.     sunrise = [data1[i][0][0:5] for i in range(3,len(data1)-1)]
  121.     sunset  = [data1[i][1][0:5] for i in range(3,len(data1)-1)]
  122.     sunmax = [data1[i][10][0:5] for i in range(3,len(data1)-1)]  #20150802: Hora de altura maxima
  123.     #print sunmax
  124.  
  125.     if ct == 0:
  126.       # Extraer los dias correspondientes solo numeros {1 a 2 longitud}
  127.       dia=[]
  128.       er_num = "^\d{1,2}$"
  129.       cmp_num = compile(er_num)
  130.       for i in range(len(header)):
  131.         mo_num = cmp_num.search(header[i])
  132.         if mo_num: dia.append(header[i].zfill(2))
  133.       fsun=[]
  134.       # fsunset=[]
  135.       for i in range(len(dia)):
  136.         sFecha = year+' '+month+' '+dia[i]
  137.         fecha = strptime(sFecha,'%Y %b %d')
  138.         # sFecha = str(fecha['tm_year'])+'-'+str(fecha['tm_mon']).zfill(2)+'-'+str(fecha['tm_mday']).zfill(2)
  139.         sFecha = str(fecha[0])+'-'+str(fecha[1]).zfill(2)+'-'+str(fecha[2]).zfill(2)
  140.         fsun.append(sFecha)
  141.         # fecha = datetime.strptime(sFecha,'%Y %b %d %H:%M')
  142.       #print "returned: %s " % fsun
  143.  
  144.       #Recorrer cada uno de los puntos de informacion asociados a cada ciudad con los datos recopilados
  145.     for i in range(len(cabrev[k])):
  146.       #print cabrev[k][i]
  147.       #stac = k[i]   #ej: FNC_3,FNC_S,FNC_2,FNC_C...
  148.       IDstac = cabrev[k][i][1]
  149.       #IDstac = unitID(unidads,cabrev[k][i]) # Consulta por el ID corresp a la stacion
  150.       for f in range(len(fsun)):
  151.         if not BD.verificar(fsun[f],IDstac):    #No Encontro un registro previo en la tabla:: Status = 0
  152.           #Insertar registros para estructuras sunrise y sunset
  153.           BD.insSunM(0,fsun[f],IDstac,sunrise[f],sunset[f],sunmax[f])
  154.         else:
  155.           BD.insSunM(1,fsun[f],IDstac,sunrise[f],sunset[f],sunmax[f])
  156.         #else: print 'Encontrado %s' % fsun[f]
  157.         #print fsun[f]
  158.   #Colocar el sistema en modo "CHANGE MONTH !!" procedimiento a efectuar con cada cambio de mes
  159.   res_ = BD.chgmonth('0',0)   #Capturar el valor de chgmnth
  160.   if res_ == '1': BD.chgmonth('0',1)    #Indicar que las rutinas de cambio de mes se han completado
  161.   return fsun
  162. #    print year
  163. #    print month
  164. #    print "sunrise: %s " % sunrise
  165. #    print "sunset %s " % sunset
  166.  
  167.  
  168. def moonM(BD,cabrev,fmon):
  169.  
  170.   ####
  171.   # Moon Data
  172.   # fmon es la referencia al conjunto de fechas previamente obtenida en metodo sunM
  173.  
  174.   #Expresiones Regulares
  175.   #  er_date = ">(\\d{8})<"
  176.   #  er_valu = ">(\\d+,\d{3})<"
  177.   #  cmp_date = compile(er_date)
  178.   #  cmp_valu = compile(er_valu)
  179.   er_hour = "(\\d{1,2}\:\\d{2})"
  180.   cmp_hour = compile(er_hour)
  181.  
  182.   for ct,k in enumerate(cabrev.keys()):
  183.     print urlmoom+k
  184.     r = requests.get(urlmoom+k,proxies=proxies)
  185.     root = LH.fromstring(r.content)
  186.     #root = LH.fromstring(r.text)
  187.  
  188.  
  189.     for table in root.xpath('//table[@id="tb-7dmn"]'):
  190.       header = [text(th) for th in table.xpath('//th')]
  191.       data2 = [[text(td) for td in tr.xpath('td')]
  192.                 for tr in table.xpath('//tr')]
  193.  
  194.     year = header[0]
  195.     month = header[3]
  196.     #print header
  197.     #print data2
  198.     #print data2[2][2]
  199.     print "Year:", year
  200.     print "Month:", month
  201.  
  202.     moondat = []
  203.     # Filtrar celdas inncesarias y guardar las que son:
  204.     # col0:
  205.     # col1:
  206.     # col2:
  207.     for i in range (2,len(data2)-1):
  208.       row = []
  209.       count=0
  210.       for j in range (len(data2[i])):
  211.         if count < 4:   #Limita solo a los tres primeros datos
  212.           if data2[i][j] == '-':
  213.             row.append(data2[i][j])
  214.             count+=1
  215.             #print "Yay! un dash en",(i,j)
  216.           else:
  217.             mo_hour = cmp_hour.search(data2[i][j])
  218.             if mo_hour:
  219.               #print "Yay! Una Hora", (data2[i][j],i,j)
  220.               row.append(data2[i][j])
  221.               count+=1
  222.         else: break
  223.       moondat.append(row)
  224.       print moondat
  225.       # moondat[0] =>
  226.      
  227.       for f in range(len(moondat)):   #Recorre toda la estructura moondat
  228.         FMTMONM = '%H:%M'  #generar una variable con el formato fijo de hora 24/12 Horas
  229.         if moondat[f][0] == '-':
  230.           if moondat[f][2] != '-':
  231.             if len(moondat[f][2]) > 5: FMTMONM = '%I:%M %p'
  232.             monort = strptime(moondat[f][2],FMTMONM) #20161104 change
  233.           else: monort = '-'
  234.         else:
  235.           if moondat[f][0] != '-':
  236.             if len(moondat[f][2]) > 5: FMTMONM = '%I:%M %p'
  237.             monort = strptime(moondat[f][0],FMTMONM) #20161104 change
  238.           else: monort = '-'
  239.           #monort = moondat[f][0]
  240.         if monort != '-': monort_ = str(monort[3]).zfill(2)+':'+str(monort[4]).zfill(2)
  241.         else: monort_ = '-'
  242.         for i in range(len(cabrev[k])):
  243.           IDstac = cabrev[k][i][1]
  244.         #stac = k[i]   #ej: FNC_3,FNC_S,FNC_2,FNC_C...
  245.         # IDstac = unitID(unidads,cabrev[k][i]) # Consulta por el ID corresp a la stacion
  246.         #for f in range(len(cabrev[k][i])):
  247.           if BD.verificar(fmon[f],IDstac):    #Encontro un registro previo en la tabla para poder modificarlo
  248.             #actualizar registros correspondientes para estructura moondat
  249.             if moondat[f][1] != '-':
  250.               monca = strptime(moondat[f][1],FMTMONM)
  251.               #monca_ = moondat[f][1]
  252.               monca_ = str(monca[3]).zfill(2)+':'+str(monca[4]).zfill(2)
  253.             else: monca_ = '-'
  254.             if len(moondat[f]) > 3:
  255.               if moondat[f][3] != '-':
  256.                 monxal = strptime(moondat[f][3],FMTMONM)
  257.                 #monxal_ = moondat[f][3]
  258.                 monxal_ = str(monxal[3]).zfill(2)+':'+str(monxal[4]).zfill(2)
  259.               else: monxal_ = '-'
  260.               #BD.insMoonM(fmon[f],IDstac,monort,moondat[f][1],moondat[f][3])
  261.             else: monxal_ = '-'
  262.             BD.insMoonM(fmon[f],IDstac,monort_,monca_,monxal_)
  263.           #else: print 'Encontrado %s' % fsun[f]
  264.         #print fsun[f]
  265.        
  266. #    print "Location %s, Data %s" % (k,moondat)
  267. #    print "Length %i" % len(moondat)
  268.     #print moonset
  269.  
  270.  
  271. def moonD(BD,curmoonph,cabrev):
  272. ###
  273. # Obtener fase de la luna para el dia actual (Data Diary)
  274. # curmoonph:  cursor con
  275.   for ct,k in enumerate(cabrev.keys()):
  276.     print urlmood+k
  277.     url = urlmood+k
  278.     #url = "http://www.timeanddate.com/astronomy/colombia/cartagena"
  279.     r = requests.get(url,proxies=proxies)
  280.     root = LH.fromstring(r.content)
  281.  
  282.     moontxt = root.xpath('//*[@id="qlook"]/p/text()')
  283.     #moonpct = root.xpath('//*[@id="qlook"]/div/text()')
  284.     moonpct = root.xpath('//span[@id="cur-moon-percent"]/text()')
  285.     moonpct = moonpct[0][-5:-1] #Solo numeros
  286.     #print moontxt,moonpct
  287.     monDate = root.xpath('//span[@id="smct"]/text()')   #4 Nov 2016, 16:54:03 / Nov 7, 2016 at 8:00:03 AM
  288.     print monDate #ValueError: time data '2016 at  4, Nov' does not match format '%Y %b %d'
  289.  
  290.     ### 20161108: Solucion al inconveniente del formato de fecha dual que se recibe desde moonDate (website)
  291.     if search('\w{3}\s\d+\,\s\d{4}',monDate[0]):  #ej: Nov 7, 2016 at 8:00:03 AM
  292.       print "PATTERN(1) \w{3}\s\d+\,\s\d{4}"
  293.  
  294.       #Obtener posicion de los espacios en la cadena moonDate para extraer: day, mont, year actual
  295.       sp1 = monDate[0].find(' ') #primer espacio que ubica el dia (cambiado el 20161104)
  296.       sp2 = monDate[0].find(' ',sp1+1)
  297.       sp3 = monDate[0].find(' ',sp2+1)
  298.       #day = monDate[0:sp1]   #formato anterior (20161104)
  299.       #mont = monDate[sp1+1:sp2] #formato anterior (20161104)
  300.       monDate = monDate[0][:sp3]
  301.       mont = monDate[0:sp1]
  302.       day = monDate[sp1+1:sp2-1]
  303.       #year = monDate[sp2+1:]   #viejo formato de fecha desde su URL original
  304.       year = monDate[-4:]
  305.  
  306.     elif search('\d+\s\w{3}\s\d{4}\,',monDate[0]):  #4 Nov 2016, 20:32:20
  307.       print "PATTERN(2) \d+\s\w{3}\s\d{4}\,"
  308.       sp1 = monDate[0].find(' ') #primer espacio que ubica el dia (cambiado el 20161104)
  309.       sp2 = monDate[0].find(' ',sp1+1)
  310.       sp3 = monDate[0].find(' ',sp2+1)
  311.       monDate = monDate[0][:sp3-1]
  312.       day = monDate[0:sp1]
  313.       mont = monDate[sp1+1:sp2]
  314.       year = monDate[-4:]
  315.       print monDate
  316.       print day
  317.       print mont
  318.       print year
  319.  
  320.  
  321.     #Convertir a fecha time object
  322.     sFecha = year+' '+mont+' '+day
  323.     fecha = strptime(sFecha,'%Y %b %d')
  324.     sFecha = str(fecha[0])+'-'+str(fecha[1]).zfill(2)+'-'+str(fecha[2]).zfill(2)
  325.    
  326.     #Buscar en curmoonph el ID de la fase de la luna correspondiente a la descripcion del dia => moontxt
  327.     print moontxt,moonpct
  328.     res_ = filter(lambda fase: fase['descr'] == moontxt[0], curmoonph)
  329.     abrev = res_[0]['abrev']
  330.     print abrev
  331.     for i in range(len(cabrev[k])):
  332.       IDstac = cabrev[k][i][1]
  333.       if BD.verificar(sFecha,IDstac):    #Encontro un registro previo en la tabla para poder modificarlo
  334.         BD.insMonPh(abrev,moonpct,sFecha,IDstac)
  335.  
  336.     #print type(moonfase[0].text_content())
  337.     print k, moontxt[0], moonpct, sFecha
  338.  
  339.  
  340. """
  341. for table in root.xpath('//table[@id="as-monthsun"]'):
  342. #for table in root.xpath('//table[@id="sortabletable"]'):
  343.  header = [text(th) for th in table.xpath('//th')]        # 1
  344.  data = [[text(td) for td in tr.xpath('td')]
  345.          for tr in table.xpath('//tr')]                   # 2
  346.  #data = [row for row in data if len(row)==len(header)]    # 3
  347.  data = [row for row in data]    # 3
  348.  #data = pd.DataFrame(data, columns=header)                # 4
  349.  print(data)
  350. #print(header)
  351. """
  352.  
  353. def getGFSparms(hndgfs):
  354.   gfsdat = {'NUBOSIDAD':[],'PRECIPITA':[],'TEMPERATU':[],'HUMEDAD':[],'DIRVIENTO':[],'MAGVIENTO':[],'ALTURAOLA':[]} #Diccionario para almacenar toda la info extraida de fichero de texto plano procesado por matlab previamente (Hecho por Claudia Urbano)
  355.   #gfsdat = {'NUBO':[],'PREC':[],'TEMP':[],'HUME':[],'DIRV':[],'MAGV':[],'ALTU':[]} #Diccionario para almacenar toda la info extraida de fichero de texto plano procesado por matlab previamente (Hecho por Claudia Urbano)
  356.   rgx01 = r'^\d{1,3}$|^\d{1,3}\.\d{1,8}$'   #Validar numeros con o sin decimales
  357.   reCmp = compile(rgx01)
  358.   #Analiza y procesa archivo de texto obtenido desde matlab. Los datos organizados son enviados a la BD.
  359.   lines_ = hndgfs.readlines()
  360.   # if not lines_: break
  361.   for line_ in lines_:
  362.     matrx = []
  363.     lBuffer = line_.split()
  364.     if lBuffer[0] not in ("FEC","PUNTOS","DIROLA"):
  365.         for i in range(2,len(lBuffer)):
  366.           if len(lBuffer[i]) > 8:  lBuffer[i] = lBuffer[i][:-1]
  367.           if reCmp.search(lBuffer[i]):
  368.             isnum = reCmp.search(lBuffer[i])
  369.             if isnum.group().find('.') != -1:   #Verifica que la cadena sea (!= -1) o no decimal
  370.               num = round(float(isnum.group()),2)
  371.             else:
  372.               num = int(isnum.group())
  373.             matrx.append(num)
  374.         print lBuffer[0], len(matrx)
  375.         gfsdat[lBuffer[0]].append(matrx)    #Agrega fila/vector completo matrx a gfsdat[lBuffer[0]] actual
  376.     else:
  377.       if lBuffer[0] == "FEC":
  378.         anoGFS = lBuffer[1]
  379.         mesGFS = lBuffer[2].zfill(2)
  380.         diaGFS = lBuffer[3].zfill(2)
  381.         fecGFS = anoGFS + '-' + mesGFS + '-' + diaGFS
  382.        
  383.       # matrx.append(lBuffer)
  384. # print 'Nubosidad::',gfsdat['NUBOSIDAD']
  385.   return gfsdat,fecGFS
  386.  
  387.  
  388. def probrain(value):
  389. # Obtiene el porcentaje acuerdo al promedio de lluvia para el dia o la noche (value)
  390.   if value >= 0.01 and value < 0.1:
  391.     pctg = 10
  392.   elif value >= 0.1 and value < 0.2:
  393.     pctg = 20
  394.   elif value >= 0.2 and value < 0.3:
  395.     pctg = 30
  396.   elif value >= 0.3 and value < 0.4:
  397.     pctg = 40
  398.   elif value >= 0.4 and value < 0.5:
  399.     pctg = 50
  400.   elif value >= 0.5 and value < 0.75:
  401.     pctg = 60
  402.   elif value >= 0.75 and value < 1:
  403.     pctg = 70
  404.   elif value >= 1 and value < 1.5:
  405.     pctg = 80
  406.   else: pctg = 0
  407.   return pctg
  408.  
  409.  
  410. def sameMonth(fecha,lstmnth):
  411. # 20151019: Verifica que el mes actual sea el mismo del ultimo registrado en la BD
  412.   hoymnth = int(fecha[-5:7])
  413.   lstmnth = int(lstmnth)
  414.   if hoymnth > lstmnth: return False
  415.   else: return True
  416.    
  417.  
  418. def sndGFSdat(BD,units,gfsdat,fecha,opaere,lstmnth):
  419.   GFSval=[]
  420.   #20151019: Obtener el mes de la fecha y compararlo con lstmnth. Si la fecha de hoy es mayor que la de manana
  421.   igualmes = sameMonth(fecha,lstmnth)
  422.   if not igualmes: BD.chgmonth('1',1) #Esta validacion debe efectuarse con cada cambio de mes
  423.   #return
  424.   #print type(hoymnth), type(lstmnth)
  425.   #return
  426. # toma los datos obtenidos en getGFSparmas, realiza calculos con ellos y los envia a la BD
  427. # gfsdat: estructura que contiene la informacion extraida en getGFSparms
  428.   #print gfsdat
  429.   # Recorre toda la estructura gfsdat por cada indice estructural que contiene
  430.   for k in range(len(units)): #Recorre las k listas (unidades)
  431.     for i,var in enumerate(gfsdat.keys()):  #Identifica cada variable en var: NUBOSIDAD, ALTURAOLA, PRECIPITA, TEMPERATU...
  432.       values = []
  433.       acdia = 0
  434.       acnoc = 0
  435.       GFStrc = {}
  436.       for j in range(len(gfsdat[var])):   #Recorre los n vectores (que representan cada bloque: 7-13-19-25-31-37-43-49)
  437.         values.append(gfsdat[var][j][units[k]['gfsp']-1])
  438.         if j == 4:    #reinicialice acumululadores acdia y acnoc
  439.           acdia = 0
  440.           acnoc = 0
  441.         if j in (0,1,4,5):    #dia
  442.           acdia += gfsdat[var][j][units[k]['gfsp']-1]
  443.           # print var,j,units[k]['gfsp']-1,gfsdat[var][j][units[k]['gfsp']-1]
  444.         else: #noche
  445.           acnoc += gfsdat[var][j][units[k]['gfsp']-1]
  446.         #print var,j,units[k]['gfsp']-1
  447.         if j == 3 or j == 7:
  448.           prmdia = round(acdia/2,2)
  449.           prmnoc = round(acnoc/2,2)
  450.           GFStrc = {'var':var,'point':units[k]['gfsp'],'avgday':prmdia,'avgnht':prmnoc,'rngdat':values}
  451.           GFSval.append(GFStrc)
  452.           values = []
  453.   #print GFSval
  454.   #return
  455.  
  456.   numvar = 0  #Cuenta la cantidad de variables leidas de la estructura principal por cada unidad
  457.   #print len(GFSval)
  458.   #return
  459.   for i in range(len(GFSval)):  # i hasta 49 horas
  460.     if numvar == 0:
  461.       #201709i reinicializar vectores
  462.       nubos = []
  463.       precip = []
  464.       posll_d = []
  465.       posll_n = []
  466.       temp_d = []
  467.       temp_n = []
  468.       hum_d = []
  469.       hum_n = []
  470.       dirv_d = []
  471.       dirv_n = []
  472.       velv_d = []
  473.       velv_n = []
  474.       stamar = []
  475.       insert = False
  476.       code = srchInd(units,GFSval[i]['point'])   #Buscar el codigo-BD representativo al punto gfs
  477.       print code
  478.       nubprec = 0
  479.       hwave = 0
  480. #    for j in range(len(gfsdat.keys())):  #Recorrido de los diferentes variables/parametros presente
  481.     if GFSval[i]['var'] == 'NUBOSIDAD':
  482.       numvar+=1
  483.       nubprec+=1
  484.       nubos.append(GFSval[i]['rngdat'])
  485.     #for j in range(len(GFSval[i]['rngdat'])):
  486.      #  print GFSval[i]['rngdat'][j]   #rngdat value
  487.     elif GFSval[i]['var'] == 'PRECIPITA':
  488.       numvar+=1
  489.       nubprec+=1
  490.       precip.append(GFSval[i]['rngdat'])
  491.       posll_d.append(probrain(GFSval[i]['avgday']))
  492.       posll_n.append(probrain(GFSval[i]['avgnht']))
  493.     elif GFSval[i]['var'] == 'TEMPERATU':
  494.       numvar+=1
  495.       temp_d.append(GFSval[i]['avgday'])
  496.       temp_n.append(GFSval[i]['avgnht'])
  497.     elif GFSval[i]['var'] == 'HUMEDAD':
  498.       numvar+=1
  499.       hum_d.append(GFSval[i]['avgday'])
  500.       hum_n.append(GFSval[i]['avgnht'])
  501.     elif GFSval[i]['var'] == 'DIRVIENTO':
  502.       numvar+=1
  503.       dirv_d.append(GFSval[i]['avgday'])
  504.       dirv_n.append(GFSval[i]['avgnht'])
  505.     elif GFSval[i]['var'] == 'MAGVIENTO':
  506.       numvar+=1
  507.       velv_d.append(GFSval[i]['avgday'])
  508.       velv_n.append(GFSval[i]['avgnht'])
  509.  
  510.     else: #ALTURAOLA  (Estado del Mar)
  511.       numvar+=1
  512.       hwave+=1
  513.       if code[1] == 'M':
  514.         stamar.append(GFSval[i]['rngdat'])
  515.         if hwave == 2:
  516.           #print stamar, hwave, numvar, GFSval[i]['point']
  517.           BD.iIndMarit(fecha,code[0],stamar)
  518.           hwave == 0
  519.         #print GFSval[i],fecha,code[0],stamar
  520.     if code[1] == 'T':
  521.       if nubprec == 4 and not insert: # Lee variables de  NUBOSIDAD y PRECIPITA si no las ha insertado previamente las inserta
  522.         print "fecha:%s, ind:%s, opaere:%s, nubos:%s, precip:%s" % (fecha,code[0],opaere,nubos,precip)
  523.         #print precip
  524.         BD.iIndAerea(fecha,code[0],opaere,nubos,precip)
  525.         insert = True
  526.     if numvar == 14: #(7+7)=2 dias:
  527.       #print "unit:%s tipo:%s posll_d:%s posll_n:%s temp_d:%s temp_n:%s hum_d:%s hum_n:%s dirv_d:%s dirv_n:%s velv_d:%s velv_n:%s" % \
  528.       #     (code[0],code[1],posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n)
  529.  
  530.       #BD.updindcrs(igualmes,fecha,code[0],posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n)
  531.  
  532.       numvar = 0    # si capturo las 7var x 2dias, resetear para ubicar otro code
  533.       #Calc. Probab de lluvia a partir de una funcion y entradas posll_d y posll_n
  534.    
  535.   #if not igualmes: BD.chgmonth('1');
  536.  
  537. def deltadate(sFecha,delta):
  538.   dtfecha = datetime.strptime(sFecha,'%Y-%m-%d')
  539.   fecha_ = dtfecha + timedelta(hours=delta)
  540.   return fecha_
  541.  
  542.  
  543. class pronarc_db:
  544.   db = None #inicializa la variable para el manejo de la conexion a la BD
  545.   def __init__(self,dbhost):
  546.     try:
  547.       # self.db = MySQLdb.connect(user='root', passwd='lenercabeza', db='BD_Emas')
  548.       #self.db = MySQLdb.connect(host='copiapo',user='wceren', passwd='TOBLERONE50g', db='comet') #deshabilitado 20160429 por migracion a dimarbtaweb26
  549.       self.db = MySQLdb.connect(host=dbhost,user='wceren', passwd='TOBLERONE50g', db='comet')
  550.       self.cur = self.db.cursor(MySQLdb.cursors.DictCursor)
  551.  
  552.     except MySQLdb.Error, (errno, strerror):
  553.       print "(%s): %s" % (errno, strerror)
  554.  
  555.   def chgmonth(self,status,mode):
  556.     # 20151019: Valida el estado del cambio de mes en el sistema para comportamiento adecuado
  557.     if mode == 1: #actualiza flag
  558.       str_ = "UPDATE status SET chgmnth = %s";
  559.       self.cur.execute(str_,(status))
  560.       self.db.commit()    #MariaDB requiere commit!!
  561.       return
  562.     else:
  563.       str_ = "SELECT chgmnth FROM status";
  564.       self.cur.execute(str_)
  565.       resl = self.cur.fetchone()
  566.       return resl['chgmnth']
  567.      
  568.   def getlasmonth(self):
  569.       # Obtiene el ultimo mes registrado en la BD
  570.       str_ = "SELECT MONTH(fecha) FROM indicrs ORDER BY fecha DESC LIMIT 1";
  571.       self.cur.execute(str_)
  572.       resl = self.cur.fetchone()    #fetch the query
  573.       return resl['MONTH(fecha)']
  574.  
  575.   def getmoonph(self):
  576.       str_ = "SELECT * FROM moonphase"
  577.       self.cur.execute(str_)
  578.       resl = self.cur.fetchall()    #fetch all rows
  579.       return resl
  580.  
  581.   def getunits(self):
  582.       str_ = "SELECT * FROM unidad"
  583.       self.cur.execute(str_)
  584.       resl = self.cur.fetchall()
  585.       return resl
  586.  
  587.   def getopaer(self):
  588.       str_ = "SELECT * FROM oper_aerea"
  589.       self.cur.execute(str_)
  590.       resl = self.cur.fetchall()
  591.       return resl
  592.  
  593.   def verificar(self, fecha, unit):
  594.     str_ = "SELECT fecha, unidad, fecha FROM indicrs WHERE fecha = %s AND unidad = %s"
  595.     self.cur.execute(str_, (fecha,unit))
  596.     resl = self.cur.fetchone()    #fetch the query
  597.     if resl: return True
  598.     else: return False
  599.  
  600.   def insSunM(self,mode,fecha,unit,sunort,sunoca,sunmax):
  601.     #Primera secuencia ejecutada cuando se inicia un nuevo periodo
  602.     try:
  603.       if mode == 0:   #Inserta nuevos registros mensuales (default)
  604.         str_ = "INSERT INTO indicrs (fecha,unidad,sol_ort,sol_oca,sol_mxalt) VALUES (%s,%s,%s,%s,%s)"
  605.         self.cur.execute(str_, (fecha,unit,sunort,sunoca,sunmax))
  606.         print str_ % (fecha,unit,sunort,sunoca,sunmax)
  607.       else: #Registros ya fueron introducidos previamente desde GFS data
  608.         #str_ = "UPDATE indicrs SET sol_ort=%s,sol_oca=%s,sol_mxalt=%s WHERE fecha=%s AND unidad=%s (%s,%s,%s,%s,%s)"
  609.         str_ = "UPDATE indicrs SET sol_ort=%s,sol_oca=%s,sol_mxalt=%s WHERE fecha='%s' AND unidad=%s"
  610.         self.cur.execute(str_, (sunort,sunoca,sunmax,fecha,unit))
  611.         print str_ % (sunort,sunoca,sunmax,fecha,unit)
  612.     except MySQLdb.Error, (errno, strerror):
  613.       print "(%s): %s" % (errno, strerror)
  614.     self.db.commit()    #MariaDB requiere commit!!
  615.     return
  616.  
  617.   def insMoonM(self,fecha,unit,monort,monoca,monmax):
  618.     try:
  619.       if monort != '-':
  620.         if monoca != '-':    #No tiene valor en origen (-)
  621.           if monmax != '-':
  622.             str_ = "UPDATE indicrs SET lun_ort=%s,lun_oca=%s,lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
  623.             print str_ % (monort,monoca,monmax,fecha,unit)
  624.             self.cur.execute(str_, (monort,monoca,monmax,fecha,unit))
  625.           else:
  626.             str_ = "UPDATE indicrs SET lun_ort=%s,lun_oca=%s WHERE fecha=%s AND unidad=%s"
  627.             print str_ % (monort,monoca,fecha,unit)
  628.             self.cur.execute(str_, (monort,monoca,fecha,unit))
  629.         else:
  630.           if monmax != '-':
  631.             str_ = "UPDATE indicrs SET lun_ort=%s,lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
  632.             print str_ % (monort,monmax,fecha,unit)
  633.             self.cur.execute(str_, (monort,monmax,fecha,unit))
  634.           else:
  635.             str_ = "UPDATE indicrs SET lun_ort=%s WHERE fecha=%s AND unidad=%s"
  636.             print str_ % (monort,fecha,unit)
  637.             self.cur.execute(str_, (monort,fecha,unit))
  638.       else:
  639.         if monoca != '-':
  640.           if monmax != '-':
  641.             str_ = "UPDATE indicrs SET lun_oca=%s,lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
  642.             print str_ % (monoca,monmax,fecha,unit)
  643.             self.cur.execute(str_, (monoca,monmax,fecha,unit))
  644.           else:
  645.             str_ = "UPDATE indicrs SET lun_oca=%s WHERE fecha=%s AND unidad=%s"
  646.             print str_ % (monoca,fecha,unit)
  647.             self.cur.execute(str_, (monoca,fecha,unit))
  648.         else:
  649.           if monmax != '-':
  650.             str_ = "UPDATE indicrs SET lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
  651.             print str_ % (monmax,fecha,unit)
  652.             self.cur.execute(str_, (monmax,fecha,unit))
  653.     except MySQLdb.Error, (errno, strerror):
  654.       print "(%s): %s" % (errno, strerror)
  655.     self.db.commit()    #MariaDB requiere commit!!
  656.      
  657.   def insMonPh(self,mfase,mpct,fecha,unit):
  658.     try:
  659.       str_ = "UPDATE indicrs SET moon_f=%s, moon_p=%s WHERE fecha=%s AND unidad=%s"
  660.       print str_ % (mfase,mpct,fecha,unit)
  661.       self.cur.execute(str_, (mfase,mpct,fecha,unit))
  662.     except MySQLdb.Error, (errno, strerror):
  663.       print "(%s): %s" % (errno, strerror)
  664.     self.db.commit()
  665.  
  666.   def iIndAerea(self,today,codunid,oper,cobert,precip):
  667.     rang = [7,13,19,25,31,37,43,49]  #Rango de Hora x Dia Registrado (de 24 paso a 48 hrs)
  668.     print "cobert::",cobert
  669.     try:
  670.       for i in range(len(oper)):    #Operaciones
  671.         r = 0
  672.         for j in range(len(cobert)):  #dias de cobertura (nubosidad)
  673.           for k in range(len(cobert[j])):  #vector x dia de cobertura (nubosidad)
  674.             fecha_ = deltadate(today,rang[r])
  675.             str_ = "INSERT INTO ind_aereas_ng (fecha,unidad,oper,cobert,precip) VALUES (%s,%s,%s,%s,%s)"
  676.             print str_ % (fecha_,codunid,oper[i]['code'],cobert[j][k],precip[j][k])
  677.             r+=1    #incrementa posiciones en rang
  678.             #self.cur.execute(str_, (today,codunid,oper[c]['code'],cobert[i],precip[i]))
  679.     except MySQLdb.Error, (errno, strerror):
  680.       print "(%s): %s" % (errno, strerror)
  681.     #self.db.commit()
  682.  
  683.   def iIndMarit(self,today,codunid,altola):
  684.     rang = [7,13,19,25,31,37,43,49]  #Rango de Hora x Dia Registrado
  685.     print "altola::",altola
  686.     r = 0
  687.     try:
  688.       for i in range(len(altola)):  #vector de cobertura
  689.         for j in range(len(altola[i])):
  690.           fecha_ = deltadate(today,rang[r])
  691.           str_ = "INSERT INTO ind_marit_ng (fecha,unidad,nv_cost) VALUES (%s,%s,%s)"
  692.           print str_ % (fecha_,codunid,altola[i][j])
  693.           r+=1
  694.           #self.cur.execute(str_, (today,codunid,altola[i],rang[i]))
  695.     except MySQLdb.Error, (errno, strerror):
  696.       print "(%s): %s" % (errno, strerror)
  697.     #self.db.commit()
  698.  
  699.   def updindcrs(self,samemnth,today,codunid,posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n):
  700.     try:
  701.       if samemnth:
  702.         str_ = "UPDATE indicrs SET posll_d=%s,posll_n=%s,temp_d=%s,temp_n=%s,hum_d=%s,hum_n=%s,dirv_d=%s,dirv_n=%s,velv_d=%s,velv_n=%s WHERE fecha=%s AND unidad=%s"
  703.         print str_ % (posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n,today,codunid)
  704.         #self.cur.execute(str_, (posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n,today,codunid))
  705.       else:
  706.         str_ = "INSERT INTO indicrs (fecha,unidad,posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
  707.         print str_ % (today,codunid,posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n)
  708.         #self.cur.execute(str_, (today,codunid,posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n))
  709.     except MySQLdb.Error, (errno, strerror):
  710.       print "(%s): %s" % (errno, strerror)
  711.     #self.db.commit()
  712.  
  713. #    try:
  714. #      self.cur.execute(str_, (monort,monoca,monmax,fecha,unit))
  715. #      print str_ % (monort,monoca,monmax,fecha,unit)
  716. #    except MySQLdb.Error, (errno, strerror):
  717. #      print "(%s): %s" % (errno, strerror)
  718. #    self.db.commit()    #MariaDB requiere commit!!
  719.     return
  720.  
  721.   def closecnx(self):
  722.     self.db.close()
  723.  
  724.  
  725.  
  726. if __name__ == '__main__':
  727.   #dbhost = ['dimarbtaweb19','copiapo']   #temporalmente deshabilitado
  728.   dbhost = ['copiapo']
  729.   for db in range(len(dbhost)):
  730.     cnxBD = pronarc_db(dbhost[db])    #Conexion a MariaDB
  731.     units = cnxBD.getunits()    #fetch unidades
  732.     abrevs = getUAbrv(units);   #fetch city,abrevs
  733.     opaere = cnxBD.getopaer()   #fetch operaciones aereas
  734.     lstMnt = cnxBD.getlasmonth(); # Obtiene el ultimo mes registrado
  735.     #print opaere[2]['code']
  736.     #hoy = str(ANODEFA)+'-'+str(MESDEFA).zfill(2)+'-'+str(DIADEFA).zfill(2)    #Fecha hoy obtenida del reloj
  737.     #print abrevs
  738.     if len(argv) > 1:
  739.       if argv[1] == '-type':
  740.         if argv[2] == 'm':
  741.           allmonth = sunM(cnxBD,units,abrevs) # Retorna una lista con todo el mes completo en formato YYYY-mm-dd
  742.           moonM(cnxBD,abrevs,allmonth)
  743.         elif argv[2] == 'd':
  744.           curMPh = cnxBD.getmoonph()    #Extrae tabla con fases de la luna
  745.           #print curMPh, abrevs
  746.           moonD(cnxBD,curMPh,abrevs)
  747.         elif argv[2] == 'gfs':    #Procesa conjunto de variables que proceden del GFS
  748.           fGFS = open('datapronarc_.dat')
  749.           gfsdata = getGFSparms(fGFS)   #gfsdata[0] = vector/matrix, gfsdata[1] = fecha
  750.           fGFS.close()
  751.           print "GFS date is ",gfsdata[1]
  752.           #print gfsdata[0], units
  753.           sndGFSdat(cnxBD,units,gfsdata[0],gfsdata[1],opaere,lstMnt)
  754.        
  755.     cnxBD.closecnx()    #Cerrar conexion MariaDB
  756. #  else:
  757. #    #instancia METOC_DB
  758. #    res_ = cnxBD.getmoonph()
  759. #    print res_
Advertisement
Add Comment
Please, Sign In to add comment