Transformar una fecha de formato anglosajón (mm.dd.yyyy) a formato europeo (dd/mm/yyyy) con ASP clásico

Vamos con una entrada cortita. En el trabajo todavía usamos ASP clásico en uno de los proyectos y cuando usamos un campo de fecha en HTML5 en la vista hay que andar transformando de formato europeo a anglosajón y viceversa. ¿Cómo hacemos en ASP clásico esto?

Supongamos que tenemos una cadena con la fecha en formato mm.dd.yyyy, por ejemplo recibimos el 11.30.2018 de nuestro campo Date. ¿Cómo procedemos?

arFech = split(".","11.30.2018")
strFechaEuro = arFecha(1) & "/" & arFecha(0) & "/" & arFecha(2)

De esta forma la cadena strFechaEuro almacenaría el valor “30/11/2018

Anuncios

Escribir un fichero Excel desde Python

Hace ya unos años, cuando hablábamos mucho de PHP por aquí (mi vida laboral me llevó a tener que centrarme en el SQL y el javascript principalmente) vimos cómo importar y exportar ficheros de Excel con PHP. Pero ¿cómo podemos escribir un fichero de Excel usando Python?

Hay muchas librerías para realizar esta tarea, yo en mi caso he elegido XslxWriter, que podéis descargar desde este enlace. También es muy popular xlrd/xlwt, aunque creo que solo permite exportar en formato xls, pero tiene la parte positiva de permitir importar datos.

Veamos entonces paso a paso, con ejemplos de código, cómo escribir un fichero simple xlsx con Python. Los primeros pasos en nuestro código serán importar la librería, crear un nuevo libro de trabajo y crear una nueva hoja. Lo haríamos así:

import xlsxwriter

libro = xlsxwriter.Workbook('Presupuesto1.xlsx')
hoja = libro.add_worksheet()

El constructor Workbook() nos permite crear un nuevo objeto que representaría un libro de Excel. Es importante destacar que XlsxWriter no nos permite modificar ni leer ficheros de Excel, solo podemos crearlos.

La función add_worksheet() del objeto Workbook nos permite crear nuevas hojas en nuestro libro. Si invocamos esta función sin parámetros creará las hojas con un nombre numerado de forma consecutiva (Sheet1, Sheet2, Sheet3…) pero si le pasamos una cadena esta será el nombre de la hoja.

Ahora, para continuar con el ejemplo, vamos a escribir los datos que queremos mostrar en nuestra hoja de cálculo.

# El presupuesto que pintaremos en la hoja de cálculo
presupuesto = (
    ['Equipos',     4000],
    ['Cable',        100],
    ['Armario',      200],
    ['Switch',        99],
    ['AP',            50],
    ['Router',       150],
    ['Mano de Obra', 350],
)

Ok, tenemos los datos a pintar. Tenemos la librería importada y los objetos creados. ¿Qué nos queda? Unos simples pasos: primero nos posicionamos al inicio del documento, después iteramos sobre la colección de datos pintando cada columna con el método write(), que recibirá la fila, la columna y el valor. Finalmente añadiremos una fila con los totales, calculados ya con una fórmula de sumatorio, y cerraremos el objeto Workbook().

# Nos posicionamos en la primera columna de la primera fila
row = 0
col = 0

# Iteramos los datos para ir pintando fila a fila
for concepto, precio in (presupuesto):
    hoja.write(row, col,     concepto)
    hoja.write(row, col + 1, precio)
    row += 1

#Pintamos la fila de totales
hoja.write(row, 0, 'Total:')
hoja.write(row, 1, '=SUM(B1:B7)')

#Cerramos el libro
libro.close()


Cómo saber si el valor de una variable es numérico en Python

A la hora de trabajar con datos numéricos en Python nos encontramos con un clásico ¿Cómo se que el valor que estoy recibiendo es un número? Casi todos los lenguages de programación tienen una función que nos permite evaluar si el valor almacenado en una variable es numérico, para el caso de Python vamos a ver dos opciones.

Python por defecto incluye una librería llamada math en todas sus versiones, pensada para realizar operaciones sobre datos escalares y para operaciones de trigonometría. Por otra parte existe una librería externa muy popular llamada numpy, pensada para el trabajo algebraico con matrices. Según el tipo de operaciones que vayas a realizar en tu código deberás importar una u otra.

En cualquier caso, ambas liberías tienen una función para chequear si una variable es numérica: la función isnan(), que devolverá true si el valor que está evaluando es nan (Not a Number). En el caso de usar la importada desde la librería math recibirá una sola variable y devolverá un valor booleano, en caso de usar la de numpy podrá recibir un array y evaluará todos los valores almacenados dentro del mismo, devolviendo según corresponda un valor booleano o un array de valores booleanos. Basta con importarla al principio de vuestro código y comprobarlo:

Con math en este caso devolvería true:

import math
x=float('cadena')
math.isnan(x)

Con numpy podemos trabajar con arrays:

import numpy as np
np.isnan([np.log(-1.),1.,np.log(0)])

Esto devolvería un array con un true para el primer valor evaluado y un false para los dos siguientes.

Calcula una edad dada la fecha de nacimiento con Python

Mucha gente parece tener interés en esta explicación en concreto, que ya hemos visto con Javascript y con varios sistemas de bases de datos SQL. Vamos ahora con Python ¿Cómo calculamos la edad desde una fecha?

from datetime import date #importamos date
#obtenemos la fecha del sistema
hoy = date.today()
#supongamos que tenemos la fecha de
#nacimiento guardada en la variable
#fnac (no es publicidad xDD)
edad = hoy.year - fnac.year - ((hoy.month, hoy.day) < (fnac.month, fnac.day))

Al igual que hacíamos en el caso de SQLite primero restamos los años y luego restamos la comparación entre mes y día actual y mes y día de nacimiento. Si la combianción mes/día de hoy es anterior a la combinación mes/día de nacimiento la comparación devuelve 1, si no devuelve 0.

Cálculo del logaritmo y logaritmo neperiano en Javascript.

Ayer me mandaban este chiste por Whatsapp:

Y como soy así de tocahuevos, que hasta llevo un reloj calculadora Casio, les mandé de vuelta el resultado del logaritmo neperiano de 1437. Y sí, estoy escribiendo esto para cuando me lo vuelvan a mandar, para contestar con este enlace, que me vale tanto para la sección de programación como para la de ciencia.

El elcálculo de logaritmos es la operación inversa a la exponenciación de la base del logaritmo. El desarrollo de calculadoras y ordenadores ha hecho que las tablas de logaritmos, que se usaban hace años para simplificar operaciones complejas, hayan perdido mucha importancia para los estudiantes de matemáticas en la actualidad. Este blog nos da una entrada muy intersante sobre el uso de los logaritmos.

La clase Math de Javascript tiene varias funciones para calcular un logaritmo. Para el logaritmo natural (logaritmo cuya base es el número e, un número irracional cuyo valor aproximado es 2,7182818284590452353602874713527):

//vamos a calcular el logaritmo de 5
var logaritmo = Math.log(5);

¿Y para obtener el logaritmo en base 10?

//vamos a calcular el logaritmo de 5
//pero con base decimal
var logaritmo = Math.log10(5);

¿Y para obtener el logaritmo en base 2?

//vamos a calcular el logaritmo de 5
//pero con base binaria
var logaritmo = Math.log2(5);

¿Y el logaritmo neperiano? Bueno, en lenguaje coloquial suele llamarse logaritmo neperiano al logaritmo natural, pero si nos ponemos precisos son dos conceptos disintos. El logaritmo neperiano, nombrado en honor del matemático John Napier, se calcularía con la fórmula -107*ln(x/-107):

//vamos a calcular el logaritmo neperiano
//de 5.
var logaritmo = Math.pow(-10,7)*Mat.log(5/Math.pow(-10,7))

Como puedes ver los logaritmos neperianos son esencialmente logaritmos naturales con la coma desplazada siete posiciones hacia la derecha y el signo invertido.

La instrucción Select…Case en Visual Basic

La instrucción Select…Case de Visual Basic tiene un funcionamiento similar al Switch…Case de C: nos permite evaluar el valor de una variable y ejecutar un determinado código según su valor, sin tener que acabar recurriendo a un enorme árbol de estructuras if/else anidadas. La variable se evaluará contra una serie de expresiones por orden descendente, parando en cuanto una de las evaluaciones sea verdadera.

Su sintaxis sería la siguiente:

SELECT mivariable
  CASE expresión1
   'código
  CASE expresión2
    'otro código
  CASE ELSE
    'Código por defecto
END SELECT

La variable mivariable del ejemplo sería la que vamos a evaluar. Puede ser una variable de los siguientes tipos: Boolean, Byte, Char, Date, Double, Decimal, Integer, Long, Object, SByte, Short, Single, String, UInteger, ULong, y UShort.

Tanto expresión1, como expresión2 y demás expresiones que queramos usar será valores o conjuntos de valores numéricos o de texto contra los que se evaluará mivariable. Puede responder a tres formas: un valor solo, una comparación con la sintaxis IS seguido de un operador de comparación (mayor, menor, igual, distinto) o un conjunto de valores, que puede mostrarse de dos formas: un grupo de valores separados por comas o un rango del que daremos el valor inicial y el final unidos por un TO.

Finalmente tenemos el CASE ELSE, esto es opcional y es un código que se ejecutará si el valor de mivariable no ha dado true en ninguna de sus evaluaciones.

Veamos una serie de ejemplos. Primero, veamos un código que asigna un valor de color de fondo a un grupo de usuarios:

SELECT Grupo
  CASE "Dirección"
    colorfondo="verde"
  CASE "Producción"
    colorfondo="gris"
  CASE ELSE
    colorfondo="rojo"
END SELECT

Segundo ejemplo, un código que asigna un grupo poblacional según la edad, evaluando por rangos:

SELECT Edad
  CASE 0 to 14
    grupo="Infantil"
  CASE 15 to 20
    grupo="juvenil"
  CASE 20 to 70
    grupo="adulto"
  CASE ELSE
    grupo="anciano"
END SELECT

Tercer ejemplo, en este caso con grupos de valores por comas. Evaluamos el último número de un código y marcamos si es par o impar (sí, ya se que es más fácil hacerlo con una operación de módulo, pero esto es un simple ejemplo teórico):

SELECT Numero
  CASE 1,3,5,7,9
    impar=True 
  CASE ELSE
    impar=False
END SELECT

Y vamos a cerrar con el cuarto ejemplo, usando una expresión aritmética para la evaluación, en este caso para los pesos de una competición de lucha:

SELECT Peso
  CASE IS < 48
    categoria="minimosca" 
  CASE IS < 51
    categoria="mosca" 
  CASE IS < 54
    categoria="gallo" 
  CASE IS < 57
    categoria="pluma" 
  CASE IS < 60
    categoria="ligero"
  CASE IS < 64
    categoria="superligero" 
  CASE IS < 69
    categoria="wélter" 
  CASE IS < 75
    categoria="mediano" 
  CASE IS < 81
    categoria="semipesado" 
  CASE IS = 91
    categoria="superpesado" 
END SELECT

SQL-Server: Intercambiar valores 0 y 1 en un Update

Vamos con una cuestión que seguro que nos hemos encontrado más de una vez: Tenemos un campo en una base de datos donde almacenamos un valor verdadero o falso y tenemos que realizar un Update para cambiar dicho estado. ¿Cómo hacemos para modificarlo con el menor costo posible? Te doy un par de soluciones, todas válidas para SQL-Server desde la versión 2008 hasta la 2017 (y supongo que seguirán valiendo en las posteriores):

Para la primera vamos a usar la operación del OR exclusivo bit a bit:

Update TablaEjemplo SET ValorVF = Convert(Bit,ValorVF ^ 1)

Otra opción lógica es usar el operador lógico de negación para invertir el valor:

Update TablaEjemplo SET ValorVF = Convert(Bit,~ ValorVF)

¿Y qué pasa si la tabla no está bien diseñada y en lugar de almacenar un valor bit estamos almacenando un entero? Si no podemos cambiar el diseño de la tabla todavía podemos recurrir a la primera solución, el OR exclusivo bit a bit, pero sin realizar la conversión a tipo bit:

Update TablaEjemplo SET ValorVF = ValorVF ^ 1

Y además tenemos otra opción, con una simple resta y con la función ABS(), que nos devuelve el valor absoluto del parámetro que recibe:

Update TablaEjemplo SET ValorVF = ABS(ValorVF - 1)