forked from JulioLaz/work_schedule
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata.py
182 lines (154 loc) · 6.46 KB
/
data.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import pandas as pd
import requests
import re
import pytz
from datetime import datetime
def eliminar_franjas(franjas):
if pd.isna(franjas):
return franjas
franjas_list = franjas.split(', ')
franjas_limpias = [re.sub(r'-\d+', '', franja).strip() for franja in franjas_list]
franjas_limpias = [franja for franja in franjas_limpias if franja]
return ', '.join(franjas_limpias)
def renombrar_columna(col):
match = re.search(r'\[(.*?)\]', col)
return match.group(1) if match else col
def load_data():
gsheetid = '13RwOemvOpn1g3SkWZoN_y_fbXfzdHJdVh1vlqgFqeX0'
sheetid = '1140708899'
url = f'https://docs.google.com/spreadsheets/d/{gsheetid}/export?format=csv&gid={sheetid}'
try:
df = pd.read_csv(url)
# print(df)
except requests.exceptions.RequestException as e:
print(f"Error fetching data from Google Sheets: {e}")
for col in df.columns:
if col.startswith("Horas disponibles"):
df[col] = df[col].apply(eliminar_franjas)
df.rename(columns={col: renombrar_columna(col) for col in df.columns if col.startswith("Horas disponibles")}, inplace=True)
df=df.fillna(1)
df=df.drop(columns=['Puntuación'])
return df
def add_consecutive_hours(hour_list):
if not hour_list:
return hour_list
hour_list = sorted(hour_list)
new_list = []
for i in range(len(hour_list)):
new_list.append(hour_list[i])
# Verificar si el número actual no es el último y no tiene consecutivo
if (i < len(hour_list) - 1 and hour_list[i] + 1 != hour_list[i + 1]) or (i == len(hour_list) - 1):
next_hour = hour_list[i] + 1
if next_hour == 25: # Si la hora es 24, reiniciar a 1
next_hour = 1
new_list.append(next_hour)
return sorted(set(new_list))
days = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']
def consecutive_hours():
df = load_data()
for day in days:
df[day] = df[day].apply(lambda x: ', '.join(map(str, add_consecutive_hours(list(map(int, x.split(', ')))))))
return df
paises = [
'Argentina', 'Bolivia', 'Brasil', 'Canadá', 'Chile', 'Colombia', 'Costa Rica',
'Cuba', 'Ecuador', 'El Salvador', 'España', 'Estados Unidos', 'Granada',
'Guatemala', 'Haití', 'Honduras', 'Jamaica', 'México', 'Nicaragua', 'Panamá',
'Paraguay', 'Perú', 'República Dominicana', 'Uruguay', 'Venezuela'
]
# Diccionario con los nombres de los países y sus zonas horarias principales
paises_zonas_horarias = {
'Argentina': 'America/Argentina/Buenos_Aires',
'Bolivia': 'America/La_Paz',
'Brasil': 'America/Sao_Paulo',
'Canadá': 'America/Toronto', # Puede variar según la región
'Chile': 'America/Santiago',
'Colombia': 'America/Bogota',
'Costa Rica': 'America/Costa_Rica',
'Cuba': 'America/Havana',
'Ecuador': 'America/Guayaquil',
'El Salvador': 'America/El_Salvador',
'España': 'Europe/Madrid',
'Estados Unidos': 'America/New_York', # Puede variar según la región
'Granada': 'America/Grenada',
'Guatemala': 'America/Guatemala',
'Haití': 'America/Port-au-Prince',
'Honduras': 'America/Tegucigalpa',
'Jamaica': 'America/Jamaica',
'México': 'America/Mexico_City',
'Nicaragua': 'America/Managua',
'Panamá': 'America/Panama',
'Paraguay': 'America/Asuncion',
'Perú': 'America/Lima',
'República Dominicana': 'America/Santo_Domingo',
'Uruguay': 'America/Montevideo',
'Venezuela': 'America/Caracas'
}
# Función para obtener el GMT actual para cada zona horaria
def obtener_gmt(paises_zonas_horarias):
gmt_dict = {}
for pais, zona_horaria in paises_zonas_horarias.items():
tz = pytz.timezone(zona_horaria)
now = datetime.now(tz)
gmt = now.utcoffset().total_seconds() / 3600
gmt_dict[pais] = int(gmt)
# gmt_dict[pais] = f"GMT {gmt:+}"
return gmt_dict
def gmt():
df=consecutive_hours()
gmt_paises = obtener_gmt(paises_zonas_horarias)
df['Zona Horaria'] = df['País'].map(paises_zonas_horarias)
df['GMT'] = df['País'].map(gmt_paises)
return df
dias_semana = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']
def convertir_a_gmt(horas, zona_horaria):
tz = pytz.timezone(zona_horaria)
horas_gmt = []
for hora in horas:
# Manejar la hora '24' convirtiéndola a '00' del día siguiente
if hora == '24':
local_time = datetime.strptime('2024-01-02 00:00', '%Y-%m-%d %H:%M') # Día siguiente a medianoche
else:
local_time = datetime.strptime(f'2024-01-01 {hora}:00', '%Y-%m-%d %H:%M') # Fecha ficticia para la conversión
local_dt = tz.localize(local_time)
gmt_dt = local_dt.astimezone(pytz.utc)
horas_gmt.append(gmt_dt.strftime('%H:%M'))
return ', '.join(horas_gmt)
def df_final():
df=gmt()
for dia in dias_semana:
df[f'{dia}'] = df.apply(lambda row: convertir_a_gmt(row[dia].split(', '), row['Zona Horaria']), axis=1)
return df
# Función para ordenar los valores de las columnas
# def data_final():
# df=df_final()
# def ordenar_horas(column):
# def convertir_y_ordenar(horas):
# horas_lista = horas.split(', ')
# horas_lista = sorted(horas_lista, key=lambda x: datetime.strptime(x, '%H:%M'))
# return ', '.join(horas_lista)
# df[column] = df[column].apply(convertir_y_ordenar)
# for dia in dias_semana:
# ordenar_horas(dia)
# return df
# Función para ordenar los valores de las columnas y agregar valor 24:00 si existe 0 y 23:
def data_final():
df=df_final()
def ordenar_horas(column):
def convertir_y_ordenar(horas):
horas_lista = horas.split(', ')
horas_lista = sorted(horas_lista, key=lambda x: datetime.strptime(x, '%H:%M'))
return ', '.join(horas_lista)
df[column] = df[column].apply(convertir_y_ordenar)
for dia in dias_semana:
ordenar_horas(dia)
def ordenar_y_agregar_horas(column):
def convertir_ordenar_agregar(horas):
horas_lista = horas.split(', ')
horas_lista = sorted(horas_lista, key=lambda x: datetime.strptime(x, '%H:%M'))
if horas_lista[0] == '00:00' and horas_lista[-1] == '23:00':
horas_lista.append('24:00')
return ', '.join(horas_lista)
df[column] = df[column].apply(convertir_ordenar_agregar)
for dia in dias_semana:
ordenar_y_agregar_horas(dia)
return df