Ejemplo n.º 1
0
def get_demanda_mensual(year, month, dia_a_empezar):

    actual_year = datetime.date.today().year
    actual_month = datetime.date.today().month
    today = datetime.date.today().day

    fecha_actual = str(actual_year) + utiles.check_fecha(
        actual_month) + utiles.check_fecha(today)
    fecha_actual = int(fecha_actual)
    fecha_a_traerse = str(year) + utiles.check_fecha(
        month) + utiles.check_fecha(dia_a_empezar)
    fecha_a_traerse = int(fecha_a_traerse)

    # ******************************************* INICIALES  *******************************************************
    print('Cargando demanda inicial desde la fecha ' + str(dia_a_empezar) +
          '-' + str(month) + '-' + str(year))
    save_consumos_iniciales(year, month, dia_a_empezar)
    print('Fin.')

    # ******************************************* PASADAS *******************************************************
    if fecha_a_traerse < fecha_actual:

        if actual_month == month and actual_year == year:
            dia_a_acabar = today
        else:
            dia_a_acabar = calendar.monthrange(
                year, month)[1] + 1  # numero dias del mes que se quiere traer

        print('Buscando demanda pasada...')
        save_prevision_a_pasado_by_verificado(
            year, month, dia_a_empezar,
            dia_a_acabar)  # el dia_a_cabar sustiyue a today que habia ntes
        print('Fin.')

    # ******************************************* PREVISTAS y HOY *******************************************************
    if month >= actual_month and year >= actual_year:

        print('Buscando demanda prevista...')
        save_prevision_a_futuro(year, month, dia_a_empezar)
        print('Fin.')

        # el de hoy
        if dia_a_empezar <= today and month == actual_month and year == actual_year:
            print('Buscando demanda de hoy...')
            save_prevision_de_hoy()
            print('Fin.')
Ejemplo n.º 2
0
def save_consumos_iniciales(year, month, dia_a_empezar):

    num_dias_del_mes = calendar.monthrange(year, month)[1]

    xlsx = pd.read_excel('excel/perfiles_consumo_' + str(year) + '.xlsx')

    # checking de rango de mes
    for dia in range(dia_a_empezar, num_dias_del_mes + 1):

        # dia del rango
        fecha_en_dataframe = utiles.check_fecha(
            dia) + '/' + utiles.check_fecha(month) + '/' + str(year)
        #dataframe_dia = xlsx[ (xlsx['Data'] == fecha_en_dataframe) & (xlsx['Hora']!='24:00')]
        dataframe_dia = xlsx[xlsx['Data'] == fecha_en_dataframe]

        horas = dataframe_dia['Hora']
        consumos = dataframe_dia['RESP']

        # se GUARDA
        guardar_en_txt(dia, year, month, np.column_stack((horas, consumos)))
Ejemplo n.º 3
0
def guardar_en_txt(dia, year, month, array_a_guardar):

    mydate = datetime.datetime(year, month, dia)
    mes = mydate.strftime("%B")

    directory = 'txt/demanda/' + str(year) + '/' + str(mes) + '/'

    # si el directorio no existe, se crea
    if not os.path.exists(directory):
        os.makedirs(directory)

    fecha = str(year) + utiles.check_fecha(month) + utiles.check_fecha(dia)
    txt_name = directory + fecha + '.txt'

    # si el fichero no existe, se crea
    if not os.path.exists(txt_name):
        file = open(txt_name, 'w+')
        file.close()

    # *****************************************************************************************************************
    # *****************************************************************************************************************
    # 3 - se guarda el fichero
    np.savetxt(txt_name, array_a_guardar, fmt='%s\t%s', delimiter='\n')
Ejemplo n.º 4
0
def get_previsiones_by_distrito(distrito, month, year):

    distrito = distrito.lower()
    if distrito == 'lisboa':
        distrito = 'lisbon'

    # construimos la url
    pagina_web = base_url + 'portugal/' + distrito + '/historic?month=' + str(
        month) + '&year=' + str(year)

    # quitar notificaciones
    options = Options()
    options.add_argument("--disable-notifications")

    # no cargar imagenes y usar cache para cargar mas rapido las paginas
    prefs = {
        "profile.managed_default_content_settings.images": 2,
        'disk-cache-size': 4096
    }
    options.add_experimental_option('prefs', prefs)

    # empezar a currar sin esperar a que cargue toda la pagina
    caps = DesiredCapabilities().CHROME
    caps["pageLoadStrategy"] = "none"  # complete

    # Selenium driver
    driver = webdriver.Chrome(var.CHROME_DRIVER,
                              chrome_options=options,
                              desired_capabilities=caps)
    driver.get(pagina_web)
    driver.maximize_window()

    espera = 2
    time.sleep(espera)

    lista_temp = []
    base_dia_url = '/html/body/div[1]/div[7]/section[2]/div[5]/div[3]/a['

    num_dias_del_mes = calendar.monthrange(year, month)[1]
    for dia in range(1, num_dias_del_mes + 1, 1):

        lista_temp_dia = []

        fecha = str(year) + utiles.check_fecha(month) + utiles.check_fecha(dia)

        # nos metemos en el dia
        dia_url = driver.find_element_by_xpath(base_dia_url + str(dia) + ']')
        dia_url.click()

        time.sleep(espera)

        # y empezamos a preparar el surfeo por el cuerpo de horas
        num_horas_disponibles = len(
            driver.find_elements_by_xpath('//*[@id="wt-his"]/tbody/tr'))
        base_hora_url = '//*[@id="wt-his"]/tbody/tr['
        end_hora_url = ']/th'

        hora_actual = 0  # Como hay veces que aparece "12:00" y su media hora "12:30"
        acumulador_hora_actual = 0  # acumulo las veces que pase eso (maximo dos)
        acumulador_temp_actual = 0  # y de la temp acumulado saco la media (div entre maximo dos)

        for hora in range(1, num_horas_disponibles + 1, 1):

            am_pm = '-'
            # la hora puede venir "12:00 am" o simplemente "0:00"
            ruta_hora = base_hora_url + str(hora) + end_hora_url
            texto_hora = driver.find_element_by_xpath(ruta_hora).text
            hora_original = texto_hora.split(' ')[0]
            if len(texto_hora.split(' ')) > 1:
                am_pm = texto_hora.split(' ')[1]
                am_pm = am_pm[:2]
            hora_sin_minutos = int(hora_original.split(':')[0])

            # control am/pm
            if am_pm == 'am' and hora_sin_minutos == 12:
                hora_sin_minutos = 0
            if am_pm == 'pm' and hora_sin_minutos < 12:
                hora_sin_minutos += 12

            ruta_temp = '//*[@id="wt-his"]/tbody/tr[' + str(hora) + ']/td[2]'
            temp = driver.find_element_by_xpath(ruta_temp).text
            temp_sin_signo = int(temp.split(' ')[0])

            if hora_actual == hora_sin_minutos:
                acumulador_temp_actual += temp_sin_signo
                acumulador_hora_actual += 1

            # se almacena lo que tenga esa hora (se hace la media si venia con xx:30)
            if hora_actual != hora_sin_minutos or hora == num_horas_disponibles:
                temp_media = acumulador_temp_actual / acumulador_hora_actual
                fila_actual = [
                    fecha + ':' + utiles.check_fecha(hora_actual), temp_media
                ]

                # guardamos
                lista_temp_dia.append(fila_actual)

                if hora < num_horas_disponibles:
                    # actualizamos contadores
                    hora_actual = hora_sin_minutos
                    acumulador_hora_actual = 1
                    acumulador_temp_actual = temp_sin_signo

        # CHECK de las horas que FALTEN
        lista_temp_dia_controlada = utiles.add_horas_quefalten(lista_temp_dia)

        # añadimos las horas del dia
        for ele in lista_temp_dia_controlada:
            lista_temp.append(ele)

    time.sleep(espera)

    driver.close()

    return lista_temp
Ejemplo n.º 5
0
def save_prevision_a_futuro(year, month, dia_a_empezar):

    actual_year = datetime.date.today().year
    actual_month = datetime.date.today().month
    today = datetime.date.today().day
    num_dias_del_mes = calendar.monthrange(year, month)[1]

    if actual_year == year and actual_month >= month:
        tomorrow = datetime.datetime(actual_year, actual_month,
                                     today) + timedelta(days=1)
    else:  # esto es para traerse meses siguientes
        tomorrow = datetime.datetime(year, month, dia_a_empezar)
        today = dia_a_empezar - 1
    # *****************************************************************************************************************
    # *****************************************************************************************************************
    # 1- Se cogen los consumos previstos de REN
    pagina_web = future_url

    # Selenium driver
    driver = webdriver.Chrome(var.CHROME_DRIVER)
    driver.get(pagina_web)
    driver.maximize_window()
    espera = 1
    time.sleep(espera)

    # surfeo por el html
    # check celdita columna a empezar (empieza en manhana incluido)
    celdita_columna = utiles.columna_a_empezar_prevision_demanda_ren(
        driver, tomorrow)

    if celdita_columna == -1:

        driver.close()

    else:
        # numero maximo de dias a traerse
        num_dias_a_traerse = utiles.dias_a_traerse_prev_demanda(
            driver, today, tomorrow, num_dias_del_mes)

        # seguimos surfeando
        ruta_base = '//*[@id="ctl00_ctl14_g_96459a04_7c84_4bf2_97a7_9ae2e9b5047f"]/div[2]/div/table/tbody/tr['
        ruta_intermedia = ']/td['
        ruta_final = ']'

        # el dia
        dia_a_guarda_en_txt = tomorrow.day
        for dia in range(celdita_columna,
                         celdita_columna + num_dias_a_traerse):

            # dia dividido en cuartos
            calendario_dia = utiles.get_calendario_by_cuartos(24)
            contador_calendario_dia = 0

            #check cambio de hora
            hora_maxima = celdita_hora_maxima
            fecha = str(year) + utiles.check_fecha(month) + utiles.check_fecha(
                dia_a_guarda_en_txt)
            if fecha in lista_retraso_horas:
                hora_maxima = 27
                calendario_dia = utiles.get_calendario_by_cuartos(25)
            if fecha in lista_adelanto_horas:
                hora_maxima = 25
                calendario_dia = utiles.get_calendario_by_cuartos(23)

            consumos_cuartohorarios = []
            # la hora
            for hora in range(3, hora_maxima + 1):
                ruta_celdita_hora = ruta_base + str(
                    hora) + ruta_intermedia + str(dia) + ruta_final
                consumo_celdita_hora = driver.find_element_by_xpath(
                    ruta_celdita_hora).text

                # el cuarto
                for cuarto in range(0, 4):
                    cuarto_hora = calendario_dia[contador_calendario_dia +
                                                 cuarto]
                    consumos_cuartohorarios.append(
                        (cuarto_hora, consumo_celdita_hora))

                contador_calendario_dia += 4

            # se GUARDA
            guardar_en_txt(dia_a_guarda_en_txt, year, month,
                           consumos_cuartohorarios)

            dia_a_guarda_en_txt += 1

        driver.close()
Ejemplo n.º 6
0
def save_prevision_de_hoy():

    year = datetime.date.today().year
    month = datetime.date.today().month
    today = datetime.date.today().day
    hora_actual = datetime.datetime.now().hour
    fecha_hoy = datetime.datetime(year, month, today)

    consumos_cuartohorarios = []
    # dia dividido en cuartos
    calendario_dia = utiles.get_calendario_by_cuartos(24)
    contador_calendario_dia = 0
    # *****************************************************************************************************************
    # *****************************************************************************************************************
    # 1- Se cogen los consumos previstos de REN para hoy
    pagina_web = verificada_url

    # Selenium driver
    driver = webdriver.Chrome(var.CHROME_DRIVER)
    driver.get(pagina_web)
    driver.maximize_window()
    wait = WebDriverWait(driver, 15)
    espera = 2
    time.sleep(espera)

    # surfeo por el html
    # se clickea en la flecha
    xpath_flechita = '//*[@id="ctl00_ctl14_g_5ee12aa8_2064_4404_b94d_7b6b4057473f"]/div[1]/table/tbody/tr/td[1]/input[3]'
    elem = wait.until(
        EC.presence_of_element_located((By.XPATH, xpath_flechita)))
    elem.click()
    time.sleep(espera)

    # y leemos
    ruta_base = '//*[@id="ctl00_ctl14_g_5ee12aa8_2064_4404_b94d_7b6b4057473f_ctl15"]/tbody/tr['
    ruta_final = ']/td[2]'

    # la hora
    for hora in range(3, hora_actual + 3):
        ruta_celdita_hora = ruta_base + str(hora) + ruta_final

        # control de cambio de hora
        try:
            consumo_celdita_hora = driver.find_element_by_xpath(
                ruta_celdita_hora)
        except NoSuchElementException:
            break
        consumo_celdita_hora = consumo_celdita_hora.text
        consumo_celdita_hora = consumo_celdita_hora.replace(',', '.')

        # el cuarto
        for cuarto in range(0, 4):
            cuarto_hora = calendario_dia[contador_calendario_dia + cuarto]
            consumos_cuartohorarios.append((cuarto_hora, consumo_celdita_hora))

        contador_calendario_dia += 4

    driver.close()

    # *****************************************************************************************************************
    # *****************************************************************************************************************
    # 2- Ahora se cogen los previstos para hoy
    pagina_web = future_url

    # Selenium driver
    driver = webdriver.Chrome(var.CHROME_DRIVER)
    driver.get(pagina_web)
    driver.maximize_window()
    espera = 1
    time.sleep(espera)

    # check celdita columna a empezar
    celdita_columna = utiles.columna_a_empezar_prevision_demanda_ren(
        driver, fecha_hoy)

    # surfeo por el html
    ruta_base = '//*[@id="ctl00_ctl14_g_96459a04_7c84_4bf2_97a7_9ae2e9b5047f"]/div[2]/div/table/tbody/tr['
    ruta_final = ']/td[' + str(celdita_columna) + ']'

    hora_a_empezar = hora_actual + 3

    # check cambio de hora
    hora_maxima = celdita_hora_maxima
    fecha = str(year) + utiles.check_fecha(month) + utiles.check_fecha(today)
    if fecha in lista_retraso_horas:
        hora_maxima = 27
        calendario_dia = utiles.get_calendario_by_cuartos(25)
    if fecha in lista_adelanto_horas:
        hora_maxima = 25
        calendario_dia = utiles.get_calendario_by_cuartos(23)

    # la hora
    for hora in range(hora_a_empezar, hora_maxima + 1):
        ruta_celdita_hora = ruta_base + str(hora) + ruta_final
        consumo_celdita_hora = driver.find_element_by_xpath(
            ruta_celdita_hora).text

        # el cuarto
        for cuarto in range(0, 4):
            cuarto_hora = calendario_dia[contador_calendario_dia + cuarto]
            consumos_cuartohorarios.append((cuarto_hora, consumo_celdita_hora))

        contador_calendario_dia += 4

    # se GUARDA
    guardar_en_txt(datetime.date.today().day, year, month,
                   consumos_cuartohorarios)

    driver.close()
Ejemplo n.º 7
0
def save_prevision_a_pasado_by_verificado(year, month, dia_a_empezar,
                                          dia_a_acabar):
    # *****************************************************************************************************************
    # *****************************************************************************************************************
    # 1- Se cogen los consumos previstos de REN para ayer
    pagina_web = verificada_url

    # Selenium driver
    driver = webdriver.Chrome(var.CHROME_DRIVER)
    driver.get(pagina_web)
    driver.maximize_window()
    wait = WebDriverWait(driver, 15)
    espera = 2
    time.sleep(espera)

    # se buscan todos los dias hasta ayer
    for dia in range(dia_a_empezar, dia_a_acabar):  # excluye hoy

        # surfeo por el html
        # se cubre el campo
        campo_fecha = driver.find_element_by_id(
            "ctl00_ctl14_g_5ee12aa8_2064_4404_b94d_7b6b4057473f_ctl04_foo")
        campo_fecha.clear()

        fecha_a_cubrir = str(year) + '-' + utiles.check_fecha(
            month) + '-' + utiles.check_fecha(dia)
        campo_fecha.send_keys(fecha_a_cubrir)

        # se clickea en la flecha
        xpath_flechita = '//*[@id="ctl00_ctl14_g_5ee12aa8_2064_4404_b94d_7b6b4057473f"]/div[1]/table/tbody/tr/td[1]/input[3]'
        elem = wait.until(
            EC.presence_of_element_located((By.XPATH, xpath_flechita)))
        elem.click()
        time.sleep(espera)

        # y leemos
        ruta_base = '//*[@id="ctl00_ctl14_g_5ee12aa8_2064_4404_b94d_7b6b4057473f_ctl15"]/tbody/tr['
        ruta_final = ']/td[2]'

        consumos_cuartohorarios = []
        # dia dividido en cuartos
        calendario_dia = utiles.get_calendario_by_cuartos(24)
        contador_calendario_dia = 0

        # check cambio de hora
        hora_maxima = celdita_hora_maxima
        fecha = str(year) + utiles.check_fecha(month) + utiles.check_fecha(dia)
        if fecha in lista_retraso_horas:
            hora_maxima = 27
            calendario_dia = utiles.get_calendario_by_cuartos(25)
        if fecha in lista_adelanto_horas:
            hora_maxima = 25
            calendario_dia = utiles.get_calendario_by_cuartos(23)

        # la hora
        for hora in range(3, hora_maxima + 1):
            ruta_celdita_hora = ruta_base + str(hora) + ruta_final

            # control de cambio de hora
            try:
                consumo_celdita_hora = driver.find_element_by_xpath(
                    ruta_celdita_hora)
            except NoSuchElementException:
                break
            consumo_celdita_hora = consumo_celdita_hora.text
            consumo_celdita_hora = consumo_celdita_hora.replace(',', '.')

            # el cuarto
            for cuarto in range(0, 4):
                cuarto_hora = calendario_dia[contador_calendario_dia + cuarto]
                consumos_cuartohorarios.append(
                    (cuarto_hora, consumo_celdita_hora))

            contador_calendario_dia += 4

        # se GUARDA
        guardar_en_txt(dia, year, month, consumos_cuartohorarios)

    driver.close()
Ejemplo n.º 8
0
def get_temp_porto(year):

    pagina_web = 'https://meteo.isep.ipp.pt/gauges'

    # Selenium driver
    driver = webdriver.Chrome(var.CHROME_DRIVER)
    driver.get(pagina_web)
    driver.maximize_window()
    wait = WebDriverWait(driver, 15)

    espera = 1
    time.sleep(espera)

    # pestaña del resumen mensual
    xpath_relatorios = '/html/body/app-root/div/div/mat-toolbar/mat-nav-list/a[6]'
    elem = wait.until(
        EC.presence_of_element_located((By.XPATH, xpath_relatorios)))
    elem.click()
    time.sleep(espera)

    # seleccionar anho
    xpath_box_year = '//*[@id="mat-select-2"]/div/div[1]/span/span'
    elem = wait.until(
        EC.presence_of_element_located((By.XPATH, xpath_box_year)))
    elem.click()
    time.sleep(espera)

    # AQUI SE PILLA EL AÑO
    web_year = utiles.get_year_from_meteoisep(year)
    xpath_year = '//*[@id="mat-option-' + str(web_year) + '"]/span'
    elem = wait.until(EC.presence_of_element_located((By.XPATH, xpath_year)))
    elem.click()
    time.sleep(espera)

    # Ya leyendo las TEMPERATURAS
    calendario = utiles.get_calendario('2016')
    temperaturas_diarias = []
    for dia in calendario:
        row = dia.day
        celdita = dia.month + 1

        path_celdita = '/html/body/app-root/div/mat-sidenav-container/mat-sidenav-content/app-relat/div/mat-table[1]/mat-row[' +\
            str(row) + ']/mat-cell[' + str(celdita) + ']'

        # Se redondea la temperatura
        temp = driver.find_element_by_xpath(path_celdita).text
        temp = temp.replace(',', '.')
        temp = float(temp)
        temp = round(temp)

        fecha = str(dia.year) + utiles.check_fecha(
            dia.month) + utiles.check_fecha(dia.day)

        temperaturas_diarias.append((fecha, temp))

    # se guarda en txt
    np.savetxt('txt/temperaturas/distrito\\' + year + '\\' + 'porto' + '.txt',
               temperaturas_diarias,
               fmt='%s\t%s',
               encoding="latin-1",
               newline="\n")

    driver.close()
Ejemplo n.º 9
0
def navigate_web(concello, url, calendario, fDistrito):

    # quitar notificaciones
    options = Options()
    options.add_argument("--disable-notifications")

    # Selenium driver
    driver = webdriver.Chrome(var.CHROME_DRIVER, chrome_options=options)
    driver.get(url)
    driver.maximize_window()
    wait = WebDriverWait(driver, 100)

    # cerrar cookies
    cookies = wait.until(EC.presence_of_element_located((By.ID, "sendOpGdpr")))
    cookies.click()

    espera = 1
    time.sleep(espera)

    if (driver.title == 'Error 404 Not Found. - tempo.pt'
        ):  # si no  tiene histórico

        print('Sin histórico: ' + url)

    else:
        time.sleep(5)

        # pestaña del resumen mensual
        elem = wait.until(
            EC.presence_of_element_located((By.ID, "tipoResumen_1")))
        elem.click()
        time.sleep(espera)

        # variable para controlar si hay datos de un mes (caso primeros 4 meses 2017)
        has_no_month = False

        # ------inicializacion--------

        # se clickea en el icono de calendario
        elem_icon_calendario = wait.until(
            EC.presence_of_element_located((By.ID, "datos_calendario_month")))
        elem_icon_calendario.click()
        time.sleep(espera)

        #se situa en el año
        for veces in range(0, (initial_year - calendario[0].year)):
            elem_pre_mes = wait.until(
                EC.presence_of_element_located((By.ID, "prev-mes")))
            elem_pre_mes.click()
            time.sleep(espera)

        # MESES
        contador_dia_mes = 0
        for i in range(mes_inicial, meses_a_crawlear + 1):

            # mes que toque
            mes = 'month' + str(i)
            elemento_mes = wait.until(
                EC.presence_of_element_located((By.ID, mes)))

            time.sleep(espera)

            # para situarse en el año que se pida
            if has_no_month == True:
                time.sleep(espera)
                for veces in range(0, (2018 - calendario[0].year)):
                    elem_pre_mes.click()
                    time.sleep(espera)

            # si no hay datos del mes, se coge del 2018 (en este año siempre hay datos)
            if elemento_mes.get_attribute(
                    "class") == 'month-td calendar-inactive':
                for veces in range(0, (2018 - calendario[0].year)):
                    next_mes = wait.until(
                        EC.presence_of_element_located((By.ID, 'next-mes')))
                    next_mes.click()
                    time.sleep(espera)

                elemento_mes.click()
                has_no_month = True

            else:
                elemento_mes.click()
                has_no_month = False

            time.sleep(2)

            # crawler
            soup = BeautifulSoup(driver.page_source, 'lxml')

            # dias del mes
            #row_count = len(driver.find_elements_by_xpath("//table[@id='rmes']/tbody/tr"))
            dias_del_mes = calendario.days_in_month[contador_dia_mes] + 1

            # como hay dias en los que no hay datos, se pone la temperatura media en tales casos
            temp_media = driver.find_element_by_id('mes_temp_media').text

            #se coje las temperaturas medias de cada DIA
            for j in range(1, dias_del_mes):

                dia = 'd' + str(j) + '_ini'
                tr = soup.find('tr', {"class": dia})

                # si no hay registro de ese dia, se rellena con la temperatura media del mes
                if tr == None:
                    temp = (temp_media.replace('°C', '')).strip()
                else:
                    td_list = tr.find_all("td")
                    temp = td_list[1].text
                    temp = (temp.replace('°C', '')).strip()

                fecha = str(calendario[contador_dia_mes].year) +\
                        utiles.check_fecha(calendario[contador_dia_mes].month) + \
                        utiles.check_fecha(calendario[contador_dia_mes].day)

                fila = concello + '\t' +\
                    fecha + '\t' +\
                    temp + '\n'

                print(fila)
                fDistrito.write(fila)

                contador_dia_mes += 1

            # se clickea en el icono de calendario de nuevo
            elem_icon_calendario = wait.until(
                EC.presence_of_element_located(
                    (By.ID, "datos_calendario_month")))
            elem_icon_calendario.click()
            time.sleep(espera)

    driver.close()