#!/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_