m0n0lithic icon

xpat04.py

m0n0lithic | PRO | 10/06/17 05:33:11 PM UTC | 0 ⭐ | 360 👁️ | Never ⏰ | []
Python |

30.06 KB

|

None

|

0 👍

/

0 👎

#!/usr/bin/env python
 
import lxml.html as LH
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
#import ssl
 
#class MyAdapter(HTTPAdapter):
#  def init_poolmanager(self,connections,maxsize,block=False):
#    self.poolmanager = PoolManager(num_pools=connections,
#                                       maxsize=maxsize,
#                                       block=block,
#                                       ssl_version=ssl.PROTOCOL_TLSv1)
 
 
import requests
import pandas as pd
from re import compile,search
from datetime import datetime, timedelta
from time import strptime,localtime,mktime,strftime
# from datetime import datetime 
from sys import argv
import MySQLdb
 
def text(elt):
    elt1 = elt.text_content()
    elt2 = elt1.replace(u'\xa0', u' ')
    elt3 = elt2.replace(u'\xb0', u'')
    elt3 = elt3.replace(u'\u2191 ', u'')
    #return elt.text_content().replace(u'\xa0', u' ') 
    return elt3
 
urlsunm = 'http://www.timeanddate.com/sun/colombia/'
urlmoom = 'http://www.timeanddate.com/moon/colombia/'
urlmood = 'http://www.timeanddate.com/astronomy/colombia/'
 
 
cities = {'cartagena':['FNC Sur','FN Caribe Sur'],\
           'barranquilla':['FNC Centro','FN Caribe Centro'],\
           'santa-marta':['FNC Norte','FN Caribe Norte'],\
           'san-andres':['San Andres','Providencia','Norte de SAI'],\
           'buenaventura':['Bahia Solano','Buenaventura','Tumaco','Area M 1 FNP','Area M 2 FNP','Area M 3 FNP'],\
           'mitu':['Orinoquia1','Orinoquia2','Orinoquia3','Orinoquia4','Orinoquia5','Orinoquia6'],\
           'villavicencio':['Oriente1','Oriente2','Oriente3'],\
           'florencia':['Sur1','Sur2','Sur3']}
 
gfscit = {'Providencia':1,'San Andres':2,'FN Caribe Norte':3,\
          'FN Caribe Centro':4,'FN Caribe Sur':5,'Norte de SAI':6,\
          'FNC Centro':7,'FNC Sur':8,'FNC Sur':9,'Oriente1':10,\
          'Oriente2':11,'Oriente3':12,'Orinoquia1':13,'Orinoquia2':14,\
          'Orinoquia3':15,'Sur1':16,'Sur2':17,'Sur3':18,\
          'Bahia Solano':22,'Buenaventura':23,'Tumaco':24,\
          'San Felipe':25,'Puerto Narino':26, 'Arauquita':27}
 
proxies = {
  'http': 'http://172.25.19.11:3128',
  'https': 'http://172.25.19.11:3128',
}
 
 
#Fecha actual
HORA_SYS = localtime()
#HORA_SYS = localtime(mktime((HORA_SYS[0],HORA_SYS[1],HORA_SYS[2]-12,0,0,0,0,0,0))) #fecha de ayer
ANODEFA = HORA_SYS[0]
MESDEFA = HORA_SYS[1]
DIADEFA = HORA_SYS[2]
 
def srchInd(units,gfsidx):
  #A partir del codigo de referencia gfsidx busca su codigo en unit
  res_ = filter(lambda ind: ind['gfsp'] == gfsidx, units)
  return res_[0]['ind'],res_[0]['tipo']   #Unidad,Tipo
  # return res_[0]['ind'] #Retorna codigo principal asociado a la BD
 
def getUAbrv(unidcurs):
  cabrev = {}
  #print cities.keys()
  for i,city in enumerate(cities.keys()): #ciudad
    #print cities[city] 
    abrev =[]
    for j in range(len(cities[city])): #descripcion
      res_ = filter(lambda abrev: abrev['descr'] == cities[city][j], unidcurs)
      abrev.append((res_[0]['abrev'],res_[0]['ind']))   #Guarda Abreviatura e indice interno de referencia
    cabrev[city] = abrev
      #print cities[city][j], res_
    #cabrev=dict(city=abrev)
    #cabrev{cities[city]}.append(abrev)
  return cabrev   #Retorna diccionario con la info de city,abrev
 
 
def unitID(unidcurs,unidad):
  # encuentra el indice corresp a la unidad
  # http://stackoverflow.com/questions/1580270/whats-the-best-way-to-search-for-a-python-dictionary-value-in-a-list-of-diction
  if any(d['abrev'] == unidad for d in unidcurs):
    # Obtenga el ID correspondiente a la unidad consultada
    res_ = filter(lambda unit: unit['abrev'] == unidad, unidcurs)
    return res_[0]['ind']
  else: return None   #No encontro resultado
 
def sunM(BD,unidads,cabrev):
# BD: conex. Base de datos COMET
# lista de tabla UNIDAD, lista 
  #print cabrev.keys()
  for ct,k in enumerate(cabrev.keys()):
    #print ct,k
    print urlsunm+k
    # Sun Data (monthly)
    # url = 'http://www.timeanddate.com/sun/colombia/cartagena'
    r = requests.get(urlsunm+k,proxies=proxies)
    root = LH.fromstring(r.content)
    #root = LH.fromstring(r.text)
 
    for table in root.xpath('//table[@id="as-monthsun"]'):
      header = [text(th) for th in table.xpath('//th')]
      data1 = [[text(td) for td in tr.xpath('td')]
              for tr in table.xpath('//tr')]
      #data = [row for row in data if len(row)==len(header)]
 
    year = header[0]
    month = header[7]
    sunrise = [data1[i][0][0:5] for i in range(3,len(data1)-1)]
    sunset  = [data1[i][1][0:5] for i in range(3,len(data1)-1)]
    sunmax = [data1[i][10][0:5] for i in range(3,len(data1)-1)]  #20150802: Hora de altura maxima
    #print sunmax 
  
    if ct == 0:
      # Extraer los dias correspondientes solo numeros {1 a 2 longitud}
      dia=[]
      er_num = "^\d{1,2}$"
      cmp_num = compile(er_num)
      for i in range(len(header)):
        mo_num = cmp_num.search(header[i])
        if mo_num: dia.append(header[i].zfill(2))
      fsun=[]
      # fsunset=[]
      for i in range(len(dia)):
        sFecha = year+' '+month+' '+dia[i]
        fecha = strptime(sFecha,'%Y %b %d')
        # sFecha = str(fecha['tm_year'])+'-'+str(fecha['tm_mon']).zfill(2)+'-'+str(fecha['tm_mday']).zfill(2)
        sFecha = str(fecha[0])+'-'+str(fecha[1]).zfill(2)+'-'+str(fecha[2]).zfill(2)
        fsun.append(sFecha)
        # fecha = datetime.strptime(sFecha,'%Y %b %d %H:%M')
      #print "returned: %s " % fsun
 
      #Recorrer cada uno de los puntos de informacion asociados a cada ciudad con los datos recopilados
    for i in range(len(cabrev[k])):
      #print cabrev[k][i]
      #stac = k[i]   #ej: FNC_3,FNC_S,FNC_2,FNC_C...
      IDstac = cabrev[k][i][1]
      #IDstac = unitID(unidads,cabrev[k][i]) # Consulta por el ID corresp a la stacion
      for f in range(len(fsun)):
        if not BD.verificar(fsun[f],IDstac):    #No Encontro un registro previo en la tabla:: Status = 0
          #Insertar registros para estructuras sunrise y sunset
          BD.insSunM(0,fsun[f],IDstac,sunrise[f],sunset[f],sunmax[f])
        else:
          BD.insSunM(1,fsun[f],IDstac,sunrise[f],sunset[f],sunmax[f])
        #else: print 'Encontrado %s' % fsun[f]
        #print fsun[f] 
  #Colocar el sistema en modo "CHANGE MONTH !!" procedimiento a efectuar con cada cambio de mes
  res_ = BD.chgmonth('0',0)   #Capturar el valor de chgmnth
  if res_ == '1': BD.chgmonth('0',1)    #Indicar que las rutinas de cambio de mes se han completado
  return fsun
#    print year
#    print month
#    print "sunrise: %s " % sunrise
#    print "sunset %s " % sunset
 
 
def moonM(BD,cabrev,fmon):
  
  ####
  # Moon Data
  # fmon es la referencia al conjunto de fechas previamente obtenida en metodo sunM
 
  #Expresiones Regulares
  #  er_date = ">(\\d{8})<"
  #  er_valu = ">(\\d+,\d{3})<"
  #  cmp_date = compile(er_date)
  #  cmp_valu = compile(er_valu)
  er_hour = "(\\d{1,2}\:\\d{2})"
  cmp_hour = compile(er_hour)
 
  for ct,k in enumerate(cabrev.keys()):
    print urlmoom+k
    r = requests.get(urlmoom+k,proxies=proxies)
    root = LH.fromstring(r.content)
    #root = LH.fromstring(r.text)
 
 
    for table in root.xpath('//table[@id="tb-7dmn"]'):
      header = [text(th) for th in table.xpath('//th')]
      data2 = [[text(td) for td in tr.xpath('td')]
                for tr in table.xpath('//tr')]
 
    year = header[0]
    month = header[3]
    #print header
    #print data2
    #print data2[2][2]
    print "Year:", year
    print "Month:", month
 
    moondat = []
    # Filtrar celdas inncesarias y guardar las que son:
    # col0:
    # col1:
    # col2: 
    for i in range (2,len(data2)-1):
      row = []
      count=0
      for j in range (len(data2[i])):
        if count < 4:   #Limita solo a los tres primeros datos
          if data2[i][j] == '-':
            row.append(data2[i][j])
            count+=1
            #print "Yay! un dash en",(i,j)
          else:
            mo_hour = cmp_hour.search(data2[i][j])
            if mo_hour:
              #print "Yay! Una Hora", (data2[i][j],i,j)
              row.append(data2[i][j])
              count+=1
        else: break
      moondat.append(row)
      print moondat
      # moondat[0] => 
      
      for f in range(len(moondat)):   #Recorre toda la estructura moondat
        FMTMONM = '%H:%M'  #generar una variable con el formato fijo de hora 24/12 Horas
        if moondat[f][0] == '-':
          if moondat[f][2] != '-':
            if len(moondat[f][2]) > 5: FMTMONM = '%I:%M %p'
            monort = strptime(moondat[f][2],FMTMONM) #20161104 change
          else: monort = '-'
        else:
          if moondat[f][0] != '-':
            if len(moondat[f][2]) > 5: FMTMONM = '%I:%M %p'
            monort = strptime(moondat[f][0],FMTMONM) #20161104 change
          else: monort = '-'
          #monort = moondat[f][0]
        if monort != '-': monort_ = str(monort[3]).zfill(2)+':'+str(monort[4]).zfill(2)
        else: monort_ = '-'
        for i in range(len(cabrev[k])):
          IDstac = cabrev[k][i][1]
        #stac = k[i]   #ej: FNC_3,FNC_S,FNC_2,FNC_C...
        # IDstac = unitID(unidads,cabrev[k][i]) # Consulta por el ID corresp a la stacion
        #for f in range(len(cabrev[k][i])):
          if BD.verificar(fmon[f],IDstac):    #Encontro un registro previo en la tabla para poder modificarlo
            #actualizar registros correspondientes para estructura moondat
            if moondat[f][1] != '-':
              monca = strptime(moondat[f][1],FMTMONM)
              #monca_ = moondat[f][1]
              monca_ = str(monca[3]).zfill(2)+':'+str(monca[4]).zfill(2)
            else: monca_ = '-'
            if len(moondat[f]) > 3:
              if moondat[f][3] != '-':
                monxal = strptime(moondat[f][3],FMTMONM)
                #monxal_ = moondat[f][3]
                monxal_ = str(monxal[3]).zfill(2)+':'+str(monxal[4]).zfill(2)
              else: monxal_ = '-'
              #BD.insMoonM(fmon[f],IDstac,monort,moondat[f][1],moondat[f][3])
            else: monxal_ = '-'
            BD.insMoonM(fmon[f],IDstac,monort_,monca_,monxal_)
          #else: print 'Encontrado %s' % fsun[f]
        #print fsun[f] 
        
#    print "Location %s, Data %s" % (k,moondat)
#    print "Length %i" % len(moondat)
    #print moonset
 
 
def moonD(BD,curmoonph,cabrev):
###
# Obtener fase de la luna para el dia actual (Data Diary)
# curmoonph:  cursor con 
  for ct,k in enumerate(cabrev.keys()):
    print urlmood+k
    url = urlmood+k
    #url = "http://www.timeanddate.com/astronomy/colombia/cartagena"
    r = requests.get(url,proxies=proxies)
    root = LH.fromstring(r.content)
  
    moontxt = root.xpath('//*[@id="qlook"]/p/text()')
    #moonpct = root.xpath('//*[@id="qlook"]/div/text()')
    moonpct = root.xpath('//span[@id="cur-moon-percent"]/text()')
    moonpct = moonpct[0][-5:-1] #Solo numeros
    #print moontxt,moonpct
    monDate = root.xpath('//span[@id="smct"]/text()')   #4 Nov 2016, 16:54:03 / Nov 7, 2016 at 8:00:03 AM
    print monDate #ValueError: time data '2016 at  4, Nov' does not match format '%Y %b %d'
 
    ### 20161108: Solucion al inconveniente del formato de fecha dual que se recibe desde moonDate (website)
    if search('\w{3}\s\d+\,\s\d{4}',monDate[0]):  #ej: Nov 7, 2016 at 8:00:03 AM
      print "PATTERN(1) \w{3}\s\d+\,\s\d{4}"
 
      #Obtener posicion de los espacios en la cadena moonDate para extraer: day, mont, year actual
      sp1 = monDate[0].find(' ') #primer espacio que ubica el dia (cambiado el 20161104)
      sp2 = monDate[0].find(' ',sp1+1)
      sp3 = monDate[0].find(' ',sp2+1)
      #day = monDate[0:sp1]   #formato anterior (20161104)
      #mont = monDate[sp1+1:sp2] #formato anterior (20161104) 
      monDate = monDate[0][:sp3]
      mont = monDate[0:sp1]
      day = monDate[sp1+1:sp2-1]
      #year = monDate[sp2+1:]   #viejo formato de fecha desde su URL original
      year = monDate[-4:]
 
    elif search('\d+\s\w{3}\s\d{4}\,',monDate[0]):  #4 Nov 2016, 20:32:20
      print "PATTERN(2) \d+\s\w{3}\s\d{4}\,"
      sp1 = monDate[0].find(' ') #primer espacio que ubica el dia (cambiado el 20161104)
      sp2 = monDate[0].find(' ',sp1+1)
      sp3 = monDate[0].find(' ',sp2+1)
      monDate = monDate[0][:sp3-1]
      day = monDate[0:sp1]
      mont = monDate[sp1+1:sp2]
      year = monDate[-4:]
      print monDate
      print day
      print mont
      print year
 
 
    #Convertir a fecha time object
    sFecha = year+' '+mont+' '+day
    fecha = strptime(sFecha,'%Y %b %d')
    sFecha = str(fecha[0])+'-'+str(fecha[1]).zfill(2)+'-'+str(fecha[2]).zfill(2)
    
    #Buscar en curmoonph el ID de la fase de la luna correspondiente a la descripcion del dia => moontxt
    print moontxt,moonpct
    res_ = filter(lambda fase: fase['descr'] == moontxt[0], curmoonph)
    abrev = res_[0]['abrev']
    print abrev
    for i in range(len(cabrev[k])):
      IDstac = cabrev[k][i][1]
      if BD.verificar(sFecha,IDstac):    #Encontro un registro previo en la tabla para poder modificarlo
        BD.insMonPh(abrev,moonpct,sFecha,IDstac)
  
    #print type(moonfase[0].text_content())
    print k, moontxt[0], moonpct, sFecha
 
 
"""
for table in root.xpath('//table[@id="as-monthsun"]'):
#for table in root.xpath('//table[@id="sortabletable"]'):
  header = [text(th) for th in table.xpath('//th')]        # 1
  data = [[text(td) for td in tr.xpath('td')]
          for tr in table.xpath('//tr')]                   # 2
  #data = [row for row in data if len(row)==len(header)]    # 3
  data = [row for row in data]    # 3
  #data = pd.DataFrame(data, columns=header)                # 4
  print(data)
#print(header)
"""
 
def getGFSparms(hndgfs):
  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)
  #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)
  rgx01 = r'^\d{1,3}$|^\d{1,3}\.\d{1,8}$'   #Validar numeros con o sin decimales
  reCmp = compile(rgx01)
  #Analiza y procesa archivo de texto obtenido desde matlab. Los datos organizados son enviados a la BD.
  lines_ = hndgfs.readlines()
  # if not lines_: break
  for line_ in lines_:
    matrx = []
    lBuffer = line_.split()
    if lBuffer[0] not in ("FEC","PUNTOS","DIROLA"):
        for i in range(2,len(lBuffer)):
          if len(lBuffer[i]) > 8:  lBuffer[i] = lBuffer[i][:-1]
          if reCmp.search(lBuffer[i]):
            isnum = reCmp.search(lBuffer[i])
            if isnum.group().find('.') != -1:   #Verifica que la cadena sea (!= -1) o no decimal
              num = round(float(isnum.group()),2)
            else:
              num = int(isnum.group())
            matrx.append(num)
        print lBuffer[0], len(matrx)
        gfsdat[lBuffer[0]].append(matrx)    #Agrega fila/vector completo matrx a gfsdat[lBuffer[0]] actual
    else:
      if lBuffer[0] == "FEC":
        anoGFS = lBuffer[1]
        mesGFS = lBuffer[2].zfill(2)
        diaGFS = lBuffer[3].zfill(2)
        fecGFS = anoGFS + '-' + mesGFS + '-' + diaGFS
        
      # matrx.append(lBuffer)
# print 'Nubosidad::',gfsdat['NUBOSIDAD']
  return gfsdat,fecGFS
 
 
def probrain(value):
# Obtiene el porcentaje acuerdo al promedio de lluvia para el dia o la noche (value)
  if value >= 0.01 and value < 0.1:
    pctg = 10
  elif value >= 0.1 and value < 0.2:
    pctg = 20
  elif value >= 0.2 and value < 0.3:
    pctg = 30
  elif value >= 0.3 and value < 0.4:
    pctg = 40
  elif value >= 0.4 and value < 0.5:
    pctg = 50
  elif value >= 0.5 and value < 0.75:
    pctg = 60
  elif value >= 0.75 and value < 1:
    pctg = 70
  elif value >= 1 and value < 1.5:
    pctg = 80
  else: pctg = 0
  return pctg
 
 
def sameMonth(fecha,lstmnth):
# 20151019: Verifica que el mes actual sea el mismo del ultimo registrado en la BD
  hoymnth = int(fecha[-5:7])
  lstmnth = int(lstmnth)
  if hoymnth > lstmnth: return False
  else: return True
    
 
def sndGFSdat(BD,units,gfsdat,fecha,opaere,lstmnth):
  GFSval=[]
  #20151019: Obtener el mes de la fecha y compararlo con lstmnth. Si la fecha de hoy es mayor que la de manana
  igualmes = sameMonth(fecha,lstmnth)
  if not igualmes: BD.chgmonth('1',1) #Esta validacion debe efectuarse con cada cambio de mes
  #return
  #print type(hoymnth), type(lstmnth)
  #return
# toma los datos obtenidos en getGFSparmas, realiza calculos con ellos y los envia a la BD
# gfsdat: estructura que contiene la informacion extraida en getGFSparms
  #print gfsdat
  # Recorre toda la estructura gfsdat por cada indice estructural que contiene
  for k in range(len(units)): #Recorre las k listas (unidades)
    for i,var in enumerate(gfsdat.keys()):  #Identifica cada variable en var: NUBOSIDAD, ALTURAOLA, PRECIPITA, TEMPERATU...
      values = []
      acdia = 0
      acnoc = 0
      GFStrc = {}
      for j in range(len(gfsdat[var])):   #Recorre los n vectores (que representan cada bloque: 7-13-19-25-31-37-43-49)
        values.append(gfsdat[var][j][units[k]['gfsp']-1])
        if j == 4:    #reinicialice acumululadores acdia y acnoc
          acdia = 0
          acnoc = 0
        if j in (0,1,4,5):    #dia
          acdia += gfsdat[var][j][units[k]['gfsp']-1]
          # print var,j,units[k]['gfsp']-1,gfsdat[var][j][units[k]['gfsp']-1]
        else: #noche
          acnoc += gfsdat[var][j][units[k]['gfsp']-1]
        #print var,j,units[k]['gfsp']-1
        if j == 3 or j == 7:
          prmdia = round(acdia/2,2)
          prmnoc = round(acnoc/2,2)
          GFStrc = {'var':var,'point':units[k]['gfsp'],'avgday':prmdia,'avgnht':prmnoc,'rngdat':values}
          GFSval.append(GFStrc)
          values = []
  #print GFSval 
  #return
 
  numvar = 0  #Cuenta la cantidad de variables leidas de la estructura principal por cada unidad
  #print len(GFSval)
  #return
  for i in range(len(GFSval)):  # i hasta 49 horas
    if numvar == 0:
      #201709i reinicializar vectores
      nubos = []
      precip = []
      posll_d = []
      posll_n = []
      temp_d = []
      temp_n = []
      hum_d = []
      hum_n = []
      dirv_d = []
      dirv_n = []
      velv_d = []
      velv_n = []
      stamar = []
      insert = False
      code = srchInd(units,GFSval[i]['point'])   #Buscar el codigo-BD representativo al punto gfs
      print code
      nubprec = 0
      hwave = 0
#    for j in range(len(gfsdat.keys())):  #Recorrido de los diferentes variables/parametros presente
    if GFSval[i]['var'] == 'NUBOSIDAD':
      numvar+=1
      nubprec+=1
      nubos.append(GFSval[i]['rngdat'])
    #for j in range(len(GFSval[i]['rngdat'])):
     #  print GFSval[i]['rngdat'][j]   #rngdat value
    elif GFSval[i]['var'] == 'PRECIPITA':
      numvar+=1
      nubprec+=1
      precip.append(GFSval[i]['rngdat'])
      posll_d.append(probrain(GFSval[i]['avgday']))
      posll_n.append(probrain(GFSval[i]['avgnht']))
    elif GFSval[i]['var'] == 'TEMPERATU': 
      numvar+=1
      temp_d.append(GFSval[i]['avgday'])
      temp_n.append(GFSval[i]['avgnht'])
    elif GFSval[i]['var'] == 'HUMEDAD':
      numvar+=1
      hum_d.append(GFSval[i]['avgday'])
      hum_n.append(GFSval[i]['avgnht'])
    elif GFSval[i]['var'] == 'DIRVIENTO':
      numvar+=1
      dirv_d.append(GFSval[i]['avgday'])
      dirv_n.append(GFSval[i]['avgnht'])
    elif GFSval[i]['var'] == 'MAGVIENTO':
      numvar+=1
      velv_d.append(GFSval[i]['avgday'])
      velv_n.append(GFSval[i]['avgnht'])
 
    else: #ALTURAOLA  (Estado del Mar)
      numvar+=1
      hwave+=1
      if code[1] == 'M':
        stamar.append(GFSval[i]['rngdat'])
        if hwave == 2:
          #print stamar, hwave, numvar, GFSval[i]['point']
          BD.iIndMarit(fecha,code[0],stamar)
          hwave == 0
        #print GFSval[i],fecha,code[0],stamar
    if code[1] == 'T':
      if nubprec == 4 and not insert: # Lee variables de  NUBOSIDAD y PRECIPITA si no las ha insertado previamente las inserta
        print "fecha:%s, ind:%s, opaere:%s, nubos:%s, precip:%s" % (fecha,code[0],opaere,nubos,precip)
        #print precip
        BD.iIndAerea(fecha,code[0],opaere,nubos,precip)
        insert = True
    if numvar == 14: #(7+7)=2 dias:
      #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" % \
      #     (code[0],code[1],posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n)
 
      #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)
 
      numvar = 0    # si capturo las 7var x 2dias, resetear para ubicar otro code
      #Calc. Probab de lluvia a partir de una funcion y entradas posll_d y posll_n
    
  #if not igualmes: BD.chgmonth('1');
 
def deltadate(sFecha,delta):
  dtfecha = datetime.strptime(sFecha,'%Y-%m-%d')
  fecha_ = dtfecha + timedelta(hours=delta)
  return fecha_
  
 
class pronarc_db:
  db = None #inicializa la variable para el manejo de la conexion a la BD
  def __init__(self,dbhost):
    try:
      # self.db = MySQLdb.connect(user='root', passwd='lenercabeza', db='BD_Emas')
      #self.db = MySQLdb.connect(host='copiapo',user='wceren', passwd='TOBLERONE50g', db='comet') #deshabilitado 20160429 por migracion a dimarbtaweb26
      self.db = MySQLdb.connect(host=dbhost,user='wceren', passwd='TOBLERONE50g', db='comet')
      self.cur = self.db.cursor(MySQLdb.cursors.DictCursor)
 
    except MySQLdb.Error, (errno, strerror):
      print "(%s): %s" % (errno, strerror)
 
  def chgmonth(self,status,mode):
    # 20151019: Valida el estado del cambio de mes en el sistema para comportamiento adecuado
    if mode == 1: #actualiza flag
      str_ = "UPDATE status SET chgmnth = %s";
      self.cur.execute(str_,(status))
      self.db.commit()    #MariaDB requiere commit!!
      return
    else:
      str_ = "SELECT chgmnth FROM status";
      self.cur.execute(str_)
      resl = self.cur.fetchone()
      return resl['chgmnth']
      
  def getlasmonth(self):
      # Obtiene el ultimo mes registrado en la BD
      str_ = "SELECT MONTH(fecha) FROM indicrs ORDER BY fecha DESC LIMIT 1";
      self.cur.execute(str_)
      resl = self.cur.fetchone()    #fetch the query
      return resl['MONTH(fecha)']
 
  def getmoonph(self):
      str_ = "SELECT * FROM moonphase"
      self.cur.execute(str_)
      resl = self.cur.fetchall()    #fetch all rows
      return resl
 
  def getunits(self):
      str_ = "SELECT * FROM unidad"
      self.cur.execute(str_)
      resl = self.cur.fetchall()
      return resl
 
  def getopaer(self):
      str_ = "SELECT * FROM oper_aerea"
      self.cur.execute(str_)
      resl = self.cur.fetchall()
      return resl
 
  def verificar(self, fecha, unit):
    str_ = "SELECT fecha, unidad, fecha FROM indicrs WHERE fecha = %s AND unidad = %s"
    self.cur.execute(str_, (fecha,unit))
    resl = self.cur.fetchone()    #fetch the query
    if resl: return True
    else: return False
 
  def insSunM(self,mode,fecha,unit,sunort,sunoca,sunmax):
    #Primera secuencia ejecutada cuando se inicia un nuevo periodo
    try:
      if mode == 0:   #Inserta nuevos registros mensuales (default)
        str_ = "INSERT INTO indicrs (fecha,unidad,sol_ort,sol_oca,sol_mxalt) VALUES (%s,%s,%s,%s,%s)"
        self.cur.execute(str_, (fecha,unit,sunort,sunoca,sunmax))
        print str_ % (fecha,unit,sunort,sunoca,sunmax) 
      else: #Registros ya fueron introducidos previamente desde GFS data
        #str_ = "UPDATE indicrs SET sol_ort=%s,sol_oca=%s,sol_mxalt=%s WHERE fecha=%s AND unidad=%s (%s,%s,%s,%s,%s)"
        str_ = "UPDATE indicrs SET sol_ort=%s,sol_oca=%s,sol_mxalt=%s WHERE fecha='%s' AND unidad=%s"
        self.cur.execute(str_, (sunort,sunoca,sunmax,fecha,unit))
        print str_ % (sunort,sunoca,sunmax,fecha,unit) 
    except MySQLdb.Error, (errno, strerror):
      print "(%s): %s" % (errno, strerror)
    self.db.commit()    #MariaDB requiere commit!!
    return
  
  def insMoonM(self,fecha,unit,monort,monoca,monmax):
    try:
      if monort != '-':
        if monoca != '-':    #No tiene valor en origen (-)
          if monmax != '-':
            str_ = "UPDATE indicrs SET lun_ort=%s,lun_oca=%s,lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
            print str_ % (monort,monoca,monmax,fecha,unit)
            self.cur.execute(str_, (monort,monoca,monmax,fecha,unit))
          else:
            str_ = "UPDATE indicrs SET lun_ort=%s,lun_oca=%s WHERE fecha=%s AND unidad=%s"
            print str_ % (monort,monoca,fecha,unit)
            self.cur.execute(str_, (monort,monoca,fecha,unit))
        else:
          if monmax != '-':
            str_ = "UPDATE indicrs SET lun_ort=%s,lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
            print str_ % (monort,monmax,fecha,unit)
            self.cur.execute(str_, (monort,monmax,fecha,unit))
          else:
            str_ = "UPDATE indicrs SET lun_ort=%s WHERE fecha=%s AND unidad=%s"
            print str_ % (monort,fecha,unit)
            self.cur.execute(str_, (monort,fecha,unit))
      else:
        if monoca != '-':
          if monmax != '-':
            str_ = "UPDATE indicrs SET lun_oca=%s,lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
            print str_ % (monoca,monmax,fecha,unit)
            self.cur.execute(str_, (monoca,monmax,fecha,unit))
          else:
            str_ = "UPDATE indicrs SET lun_oca=%s WHERE fecha=%s AND unidad=%s"
            print str_ % (monoca,fecha,unit)
            self.cur.execute(str_, (monoca,fecha,unit))
        else:
          if monmax != '-':
            str_ = "UPDATE indicrs SET lun_mxalt=%s WHERE fecha=%s AND unidad=%s"
            print str_ % (monmax,fecha,unit)
            self.cur.execute(str_, (monmax,fecha,unit))
    except MySQLdb.Error, (errno, strerror):
      print "(%s): %s" % (errno, strerror)
    self.db.commit()    #MariaDB requiere commit!!
     
  def insMonPh(self,mfase,mpct,fecha,unit):
    try:
      str_ = "UPDATE indicrs SET moon_f=%s, moon_p=%s WHERE fecha=%s AND unidad=%s"
      print str_ % (mfase,mpct,fecha,unit)
      self.cur.execute(str_, (mfase,mpct,fecha,unit))
    except MySQLdb.Error, (errno, strerror):
      print "(%s): %s" % (errno, strerror)
    self.db.commit()
 
  def iIndAerea(self,today,codunid,oper,cobert,precip):
    rang = [7,13,19,25,31,37,43,49]  #Rango de Hora x Dia Registrado (de 24 paso a 48 hrs)
    print "cobert::",cobert
    try:
      for i in range(len(oper)):    #Operaciones
        r = 0
        for j in range(len(cobert)):  #dias de cobertura (nubosidad)
          for k in range(len(cobert[j])):  #vector x dia de cobertura (nubosidad)
            fecha_ = deltadate(today,rang[r])
            str_ = "INSERT INTO ind_aereas_ng (fecha,unidad,oper,cobert,precip) VALUES (%s,%s,%s,%s,%s)"
            print str_ % (fecha_,codunid,oper[i]['code'],cobert[j][k],precip[j][k])
            r+=1    #incrementa posiciones en rang
            #self.cur.execute(str_, (today,codunid,oper[c]['code'],cobert[i],precip[i]))
    except MySQLdb.Error, (errno, strerror):
      print "(%s): %s" % (errno, strerror)
    #self.db.commit()
 
  def iIndMarit(self,today,codunid,altola):
    rang = [7,13,19,25,31,37,43,49]  #Rango de Hora x Dia Registrado
    print "altola::",altola
    r = 0
    try:
      for i in range(len(altola)):  #vector de cobertura
        for j in range(len(altola[i])):
          fecha_ = deltadate(today,rang[r])
          str_ = "INSERT INTO ind_marit_ng (fecha,unidad,nv_cost) VALUES (%s,%s,%s)"
          print str_ % (fecha_,codunid,altola[i][j])
          r+=1
          #self.cur.execute(str_, (today,codunid,altola[i],rang[i]))
    except MySQLdb.Error, (errno, strerror):
      print "(%s): %s" % (errno, strerror)
    #self.db.commit()
 
  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):
    try:
      if samemnth:
        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"
        print str_ % (posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n,today,codunid)
        #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))
      else:
        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)"
        print str_ % (today,codunid,posll_d,posll_n,temp_d,temp_n,hum_d,hum_n,dirv_d,dirv_n,velv_d,velv_n)
        #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))
    except MySQLdb.Error, (errno, strerror):
      print "(%s): %s" % (errno, strerror)
    #self.db.commit()
 
#    try:
#      self.cur.execute(str_, (monort,monoca,monmax,fecha,unit))
#      print str_ % (monort,monoca,monmax,fecha,unit) 
#    except MySQLdb.Error, (errno, strerror):
#      print "(%s): %s" % (errno, strerror)
#    self.db.commit()    #MariaDB requiere commit!!
    return
 
  def closecnx(self):
    self.db.close()
 
 
 
if __name__ == '__main__':
  #dbhost = ['dimarbtaweb19','copiapo']   #temporalmente deshabilitado
  dbhost = ['copiapo']
  for db in range(len(dbhost)):
    cnxBD = pronarc_db(dbhost[db])    #Conexion a MariaDB
    units = cnxBD.getunits()    #fetch unidades
    abrevs = getUAbrv(units);   #fetch city,abrevs
    opaere = cnxBD.getopaer()   #fetch operaciones aereas
    lstMnt = cnxBD.getlasmonth(); # Obtiene el ultimo mes registrado
    #print opaere[2]['code']
    #hoy = str(ANODEFA)+'-'+str(MESDEFA).zfill(2)+'-'+str(DIADEFA).zfill(2)    #Fecha hoy obtenida del reloj
    #print abrevs
    if len(argv) > 1:
      if argv[1] == '-type':
        if argv[2] == 'm':
          allmonth = sunM(cnxBD,units,abrevs) # Retorna una lista con todo el mes completo en formato YYYY-mm-dd
          moonM(cnxBD,abrevs,allmonth)
        elif argv[2] == 'd':
          curMPh = cnxBD.getmoonph()    #Extrae tabla con fases de la luna
          #print curMPh, abrevs
          moonD(cnxBD,curMPh,abrevs)
        elif argv[2] == 'gfs':    #Procesa conjunto de variables que proceden del GFS
          fGFS = open('datapronarc_.dat')
          gfsdata = getGFSparms(fGFS)   #gfsdata[0] = vector/matrix, gfsdata[1] = fecha
          fGFS.close()
          print "GFS date is ",gfsdata[1]
          #print gfsdata[0], units
          sndGFSdat(cnxBD,units,gfsdata[0],gfsdata[1],opaere,lstMnt)
        
    cnxBD.closecnx()    #Cerrar conexion MariaDB
#  else:
#    #instancia METOC_DB
#    res_ = cnxBD.getmoonph()
#    print res_

Comments