Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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_
Advertisement
Add Comment
Please, Sign In to add comment