Mostrando entradas con la etiqueta date. Mostrar todas las entradas
Mostrando entradas con la etiqueta date. Mostrar todas las entradas

martes, 24 de junio de 2025

Sistemas Operativos 3.- Operaciones Básicas en Linux

¿Te pierdes entre tantos temas? 📚✨ Descubre todo lo que ofrece este blog en un solo vistazo [👉 Ver índice completo]

Comandos Básicos de Linux: Guía para Principiantes


2.1 Comandos Básicos de Linux

En este capítulo vamos a desarrollar una pequeña chuleta para poder manejarnos básicamente a través de la terminal de Linux.


Manejo de Directorios

pwd - print working directory

Este comando muestra la ruta completa del directorio actual en el que estás trabajando.
Es útil cuando navegas por muchas carpetas y necesitas saber exactamente dónde estás ubicado dentro del sistema de archivos.

comando pwd

cd - change directory

Por defecto, la secuencia de entrada en linux, nos sitúa en nuestro directorio de entrada o de trabajo (un  directorio  llamado  igual que  el  usuario,  dentro  del  directorio  /home).  Pero  al  igual  que  otros  sistemas operativos podemos cambiar de directorio mediante el mandato cd directorio. Si  no  introducimos  ningún  nombre  de  directorio,  el  mandato cd, sin  argumentos  vuelve  a  nuestro directorio de trabajo. Si queremos volver al directorio de nivel superior basta con utilizar cd ..

Comportamientos comunes:

  • Ir al directorio Personal (home):

    cd 

Que es equivalente a:

   cd ~

  • Cambiar a un subdirectorio:

    cd nombre_directorio

  • Volver al directorio anterior (última ubicación)

    cd -

  • Subir un nivel en el árbol de directorios:

    cd ..

  • Ir al directorio raíz del sistema:

    cd /

El nombre de un fichero o de un directorio se puede referenciar de forma relativa o absoluta.

  • Forma relativa: El nombre hace referencia a ficheros o directorios desde el directorio en el que nos encontramos.
  • Forma absoluta: El nombre hace referencia a todo el camino desde la raíz. Ejemplo: si nos encontramos en nuestro directorio de entrada y queremos ir al directorio /etc

Relativa: Referencia desde tu ubicación actual (ej. cd Documentos).

ruta relativa

Absoluta: Referencia desde la raíz (ej. cd /home/usuario/Documentos).

ruta absoluta

mkdir - make directory

Para crear un directorio (carpeta) es necesario utilizar la orden mkdir nombresDeDirectorio

  • Si queremos crear un solo directorio:

crear un directorio

  • Si queremos crear varios directorios:
crear varios directorios

  • Crear una estructura de directorios anidados (incluye carpetas padre sino existen)

crear directorios recursivos si no existe el padre

rmdir - Remove Directory

Para borrar un directorio es necesario utilizar la orden rmdir nombresDeDirectorio, es necesario que ese directorio este vacío. ⚠️ Si el directorio contiene archivos o subdirectorios, rmdir no lo eliminará. En ese caso, se debe usar rm -r, pero recuerda utilizarlo con precaución.

eliminar directorios

Comandos Básicos

date

Permite consultar la fecha y hora del sistema.

comando date

who / whoami

who: este comando muestra los usuarios conectados a la máquina.

comando who

whoami: Muestra tu nombre de usuario.

comando whoami

ls (Listar archivos)

Este comando muestra el contenido de un directorio. Este comando tiene varias opciones:

ls: Muestra contenido del directorio actual.

ls

Opciones útiles:

ls -a: Muestra además los archivos ocultos (aquellos cuyo nombe empieza con un ".")

ls -a

ls -F: para saber que archivos de un directorio son archivos normales, cuales directorios y cuales enlaces. (los que terminan con / = directorio, los que terminan con * = ejecutable -código- y los que terminan con @ son enlaces simbólicos) .

ls -f

ls -t: Ordena por fecha (más reciente primero).

ls -t

ls -t -r: muestra primero la información más antigua.

ls -t -r

ls -R:
muestra toda la información del directorio en el que me encuentro.

ls -R

ls -l: nos muestra más información (el nombre con sus características) sobre el contenido del del directorio donde me encuentro.

ls -l

Por ejemplo, para el fichero anterior llamado “fichero1” muestra una fila con siete columnas:
Columna 1 - está compuesta por dos partes: 
  • El primer carácter que nos informa sobre el tipo de información que es:
                        -    fichero ordinario
                        d   directorio
                        l     enlace simbólico
  • los 9 siguientes caracteres nos indican los permisos, estos caracteres se agrupan de tres en tres. Los tres primeros son los permisos para el propietario (r w -), los tres siguientes los permisos para el grupo (r --) y los tres últimos los permisos para el resto de usuarios (---). Los permisos pueden ser de lectura (r), escritura (w) y ejecución (x)
Columna 2 - número de enlaces duros.
Columna 3 - indica el nombre del propietario del fichero.
Columna 4 - grupo al que pertenece el usuario propietario del fichero.
Columna 5 - muestra el tamaño de fichero en bytes.
Columna 6 - Hace referencia a la hora en que el fichero fue modificado por última vez o creado.
Columna 7 - nombre del fichero

ls -i: Muestra el número de inodo de cada archivo.

ls -i


touch

Sirve para crear fichero en blanco.

Caracteres comodines

A veces es interesante referenciar ficheros que tengan en su nombre características comunes. “Todos los ficheros que empiezan por la letra c...”. En Linux esto se consigue utilizando caracteres especiales (llamados metacaracteres o comodines) que representan otras cosas:

  • El carácter asterisco '*' representa a cualquier cadena de caracteres arbitraria incluyendo la cadena vacía. (para buscar)
  • La interrogación '?' representa a cualquier carácter simple. (para buscar)
  • Los corchetes '[' ']' pueden contener un grupo o rango de caracteres y corresponden a un carácter simple. (para buscar)
  • Las llaves ‘{‘,’}’ deben contener diferentes alternativas, constituidas por un carácter o un grupo de caracteres, separadas todas ellas por comas. (para buscar / crear). Los dos puntos '..' entre {} en expansión de secuencias se usa para generar rangos automáticamente bien sean números o letras. Por ejemplo, vamos a crear varios ficheros:
touch

Visualización de Archivos

cat

La orden cat se utiliza para visualizar sobre la salida estándar el contenido de un fichero. Lógicamente el tipo de ficheros a visualizar debe ser de texto, ya que si utilizamos la orden con un fichero ejecutable la salida sería ilegible. Para visualizar el fichero de texto llamado prueba:

cat1

La orden cat permite listar varios ficheros secuencialmente. Si tenemos dos ficheros llamados prueba1 y prueba2, el siguiente comando nos permite hacerlo:

cat 2

Una aplicación muy útil de cat, es concatenar ficheros. Por ejemplo, si queremos concatenar los dos ficheros anteriores en un nuevo fichero llamado prueba3 bastaría con ejecutar lo siguiente:

cat2

Si queremos añadir al final de un fichero el contenido de otro:

cat3

En Linux, los caracteres > y >> se utilizan para redirigir la salida de un comando a un archivo, pero con una diferencia clave en su comportamiento:

1. > (Redirección estándar)
Sobrescribe el contenido del archivo.
Si el archivo no existe, lo crea.
Si el archivo existe, lo borra y escribe el nuevo contenido.

⚠️ ¡Cuidado!
Si usas > sobre un archivo existente, pierdes su contenido anterior.

2. >> (Redirección con anexado)
Añade el contenido al final del archivo (sin borrar lo anterior).
Si el archivo no existe, lo crea.

more

Una orden alternativa a cat es la orden more que da más control que la anterior, ya que automáticamente lista un fichero y cuando llena la terminal (lista tantas líneas como el tamaño de la terminal) se para, esperando que pulsemos una tecla (intro para continuar mostrando el contenido del fichero línea a línea o el espacio mostrar el contenido hasta que se vuelva a llenar de nuevo la terminal).

more   [ opciones]    nombre_del_fichero

La orden more tiene varias opciones interesantes:

• Con la opción -n, lista el fichero presentando de n en n líneas y no con el número de líneas que posee nuestra pantalla.

• Con el modificador +n, lista el fichero a partir de la línea n

more

more -n

more +

tail

La orden tail permite visualizar el final de un fichero (por defecto 10 líneas). El formato de este comando es:   

tail  [-numlineas]   nombrefichero

tail

La opción -f del comando tail es increíblemente útil porque te permite seguir los cambios en los archivos en tiempo real. Imagina que tienes un archivo que se está actualizando constantemente, como un archivo de registro (log) de un sistema o una aplicación; con tail -f, no solo verás las últimas líneas existentes, sino que el comando permanecerá activo y mostrará automáticamente cualquier nueva línea que se añada al archivo a medida que suceda. Esto es especialmente práctico para monitorizar la actividad en vivo, diagnosticar problemas o simplemente ver cómo crece un archivo sin tener que abrirlo y cerrarlo repetidamente.

Gestión de Archivos: copia, movimiento y renombrado de ficheros.

cp (Copiar)

Si queremos copiar un fichero utilizamos el mandato cp. Por ejemplo, para copiar el fichero llamado “fichero” al directorio dir1, con el mismo nombre:

Archivos: cp origen destino.

CP

Para copiar el fichero llamado “fichero” al directorio dir1 y llamarlo fich, en vez del nombre que tiene actualmente:
cp cambiando el nombre

La orden cp también copia directorios. Para esto utilizamos el modificador recursivo –R . Por ejemplo,si queremos copia el directorio dir1 (y todo su contenido) al directorio2

Directorios: cp -R dir1 dir2 (copia recursiva)

cp -R


mv (Mover/Renombrar)

El cometido de la orden mv es mover ficheros entre diferentes directorios. Si se usa sobre el mismo directorio el efecto obtenido consiste en cambiar el nombre al fichero. Por ejemplo, cambiamos el nombre del fichero “prueba” por “pruebilla”:

mv

Para mover el fichero “pruebilla” al directorio dir1:

mover archivo

Los permisos del fichero copiado o movido son los mismos que los del fichero original

rm (Eliminar) ⚠️ ¡Mucho cuidado con este comando!

La orden rm suprime un fichero de un directorio o un directorio completo. Con la opción –R borra un directorio con todo su contenido. ¡Ojo! Esta orden es muy peligrosa, utilízala con precaución. Para borrar un fichero:

rm archivo

Para borrar un directorio este tiene que estar vacío o utilizamos la opción -R si queremos borrar el directorio y todo lo que tiene dentro:

rm -r

Otras Órdenes Útiles para trabajar con ficheros.

sort

Ordena la información de un fichero. Esta orden la podemos utilizar con diferentes formatos:

sort nombre_fichero   - muestra el contenido del fichero ordenado

sort


sort -o fich1 fich2 - mete en fich1 el contenido del fich2 ordenado

sort -o

wc (Contar)

Sirve para contar líneas, palabras y bytes de un fichero. 

Muestra esta información de la siguiente forma:

numero de líneas     numero de palabras   numero de bytes       nombre del fichero

wc  [opciones]  nombrefichero

Opciones de esta orden:

-c - solo muestra el número de bytes

-l - solo muestra el número de líneas

-w - solo muestra el número de palabras

wc

split 

El mandato split divide un fichero de texto en partes. La sintaxis es de la forma:

    split   [-líneas]   nombre    [prefijo]

División por defecto: el prefijo por defecto es x, y el número de líneas 1000 (crea ficheros xaa, xab, xac, xad... con 1000 líneas cada uno).

Si dividimos nuestro fichero llamado “fichero” en ficheros de 3 líneas, se crean 7 ficheros

split

cut (recortar)

El mandato cut recorta columnas o campos de un fichero. 

La sintaxis en este caso es como sigue:

cut [opciones] nombre 

Las opciones pueden ser:

  • Cortando columnas. Opción -c 
  • Cortando campos (por defecto, cut asume que los campos se encuentran separados por tabuladores). Opción –f 
  • Indicar de forma explícita el carácter usado como separador entre campos. Opción –d

cut -c
En este ejemplo vemos como se cogen de cada línea del fichero los caracteres que están en la columna 2 y en la 7.
cut -f

En el ejemplo anterior los datos han sido separados por tabuladores. Al usar la orden cut -f le hemos dicho que recorte de cada fila los datos que estén antes de la primera, segunda y cuarta tabulación.


En este último ejemplo le he pedido que utilizando como separador el espacio en blanco " " que recorte lo que este antes del primer y tercer separador.


grep (Buscar)

El mandato grep permite realizar búsquedas de líneas que contengan texto que identifique a un objetivo o patrón que se especifica. Se pueden utilizar para extraer información de los archivos, buscar líneas que se relacionen con un elemento particular y para localizar archivos que contengan una palabra clave particular. La forma general del mandato es la siguiente:

grep [opciones] expresión [fichero]

Si se quiere buscar más de una palabra (una frase) separadas por espacios en blanco, o se utilizan caracteres comodín, es necesario encerrar la expresión entre comillas. 

Algunas de las opciones de este mandato son:

  • -i   La búsqueda no es sensible a mayúsculas/minúsculas
  • -n  Muestra el número de línea donde se ha encontrado la coincidencia y también la línea.
  • -l   Muestra los nombres de los ficheros, pero no las líneas.
  • -v   Muestran las líneas donde no se produce la coincidencia.
grep

Enlaces.

Aunque los enlaces duros y blandos los vimos en el post anterior merece la pena volver a repasarlos. 

El comando ln sirve para crear enlaces.

ln  -s  f1  simbo1f1 crea un enlace bando (simbólico) llamado simbo1f1 al fichero f1.

Recuerda que los enlaces simbólicos son como los accesos directos en Windows.

ln  f1  enla1f1 crea un enlace duro llamado enla1f1 al fichero f1. Los enlaces duros son como diferentes nombres para un mismo archivo. (no valen para directorios)

enlaces


Conclusión

Estos comandos son esenciales para trabajar en Ubuntu o cualquier distribución Linux. Practícalos en la terminal para familiarizarte con ellos.

jueves, 28 de marzo de 2024

El módulo Datetime y el módulo Calendar.

Modulo datetime - trabajar con funciones relacionadas con la fecha y hora.


Creando objetos date.

El módulo datetime nos proporciona clases para trabajar con la fecha y hora. 

¿Cómo podemos obtener la fecha local y crear objetos del tipo fecha?

Una de las clases proporcionadas por el módulo datetime es una clase llamada date. Los objetos de esta clase representan una fecha que consta de año, mes y día. 

La clase date del módulo datetime.

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import date
>>> hoy = date.today()
>>> print(hoy)
2024-03-20
>>> print(hoy.year)
2024
>>> print(hoy.month)
3
>>> print(hoy.day)
20
El método today nos devuelve un objeto del tipo date que representa la fecha local actual. Este objeto tiene tres atributos: 
  1. .year (año)
  2. .month(mes)
  3. .day(día)
¡Ten cuidado porque estos tres atributos son solo de lectura!   Para crear un objeto date debes pasar los atributos de año, mes y dia de la siguiente manera. 

>>> from datetime import date
>>> mi_fecha = date(2018, 8, 1)
>>> print(mi_fecha)
2018-08-01
Al crear un objeto date hay que tener en cuenta una serie de restricciones que son lógicas:
Parámetro Restricciones
year El parámetro year debe ser mayor o igual a 1 (constante MINYEAR) y menor o igual a 9999 (constante MAXYEAR).
month El parámetro month debe ser mayor o igual a 1 y menor o igual a 12.
day El parámetro day debe ser mayor o igual a 1 y menor o igual que el último día del mes y año indicados.

Creación de un objeto de fecha a partir de una marca de tiempo.


La clase date nos permite crear un objeto de fecha a partir de una marca de tiempo utilizando el método fromtimestamp

En Unix una marca de tiempo es la cantidad de segundos transcurridos desde el 01 de Enero de 1970 a las 00:00:00 (UTC)

Para poder hacer esto, podemos usar el módulo time y a su vez el método time. Python nos proporcionará la marca de tiempo actual. Un ejemplo:

La marca de tiempo con time en Unix.

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import date
>>> import time
>>> marca_tiempo = time.time()
>>> print(f"la marca de tiempo es igual a {marca_tiempo}")
la marca de tiempo es igual a 1710949396.5617826
>>> d = date.fromtimestamp(marca_tiempo)
>>> print("Fecha: ", d)
Fecha:  2024-03-20

Creación de un objeto de fecha usando el formato ISO


Como se usa mucho vamos a ver como representar una fecha usando el standar ISO 8601. Es el típico formato de AAAA-MM-DD. Uno de los métodos que podemos utilizar es fromisoformat. Los parámetros de este método son una cadena. Cuando sustituyas la fecha, asegúrate de agregar 0 antes de un mes o de un día expresado por un número menor que 10.

fecha en formato ISO

# Ejemplo de programa que construye un objeto date
# desde una cadena que contiene una fecha en formato ISO YYYY-MM-DD

from datetime import date

# cumpleaños de Leonardo da vinci
cumple_leo = "1452-04-15"

# Construimos el objeto date
leo_date = date.fromisoformat(cumple_leo)
print(f"El cumpleaños de Leonardo da Vinci es {leo_date}")
print(type(leo_date))
SALIDA:

El cumpleaños de Leonardo da Vinci es 1452-04-15
<class 'datetime.date'>


El método replace()


Si tenemos que reemplazar el año, mes o día de un objeto que ya hayamos creado, no podremos hacerlo a través de los atributos pues son de solo lectura. Para ello utilizaremos el método llamado replace.

método replace

from datetime import date

d = date(2021, 12, 5)
print(d)

d = d.replace(year=2022, month=11, day=4)
print(d)
SALIDA:

2021-12-05
2022-11-04

Los parámetros year, month o day son opcionales. Puedes pasar solo un parámetro a replace si quieres. No obstante recuerda que este método devuelve un objeto date modificado por lo que recuerda asignarlo a alguna variable.


¿Que día de la semana es?


Uno de los métodos mas útiles que facilita el trabajo con fechas es weekday. Devuelve el día de la semana como un número entero, donde 0 es el Lunes y 6 es el Domingo. 

método weekday

from datetime import date

d = date(2003,3,14)
print(d.weekday())
SALIDA:

4

La clase date también tiene un método similar llamado isoweekday que también devuelve el día de la semana como un número entero pero 1 es Lunes y 7 Domingo. 

método isoweekday

from datetime import date

d = date(2003,3,14)
print(d.weekday())
SALIDA:

5

Como puedes ver para la misma fecha obtenemos un entero diferente, pero que expresa el mismo día de la semana. El entero devuelto por isoweekday sigue la especificación ISO 85601.


Creando objetos Time.


El módulo datetime también tiene una clase que nos permite representar la hora, es la clase time.

time(hour, minute, second, microsecond, tzinfo, fold)

El constructor de la clase time, acepta los siguientes parámetros opcionales:

- hour                   El párametro hour debe ser mayor o igual que 0 y menor que 23.
- minute            -    El párametro minute debe ser mayor o igual que 0 y menor que 59.
- second            -    El párametro second debe ser mayor o igual que 0 y menor que 59.
- microsecond     El párametro microsecond debe ser mayor o igual que 0 y menor que 1000000.
- tzinfo                El párametro tzinfo debe ser un objeto de la subclase tzinfo o None (por defecto).
- fold                   El párametro fold debe ser 0 o 1 (predeterminadamente 0).

En la práctica si queremos construir un objeto de tiempo lo haremos de la siguiente manera:

clase time

from datetime import time

t = time(20,1,20,1)

print("Tiempo:", t)
print("Hora:", t.hour)
print("Minutos:", t.minute)
print("Segundos:", t.second)
print("Microsegundo:", t.microsecond)
SALIDA:

Tiempo: 20:01:20.000001
Hora: 20
Minutos: 1
Segundos: 20
Microsegundo: 1


El módulo time.


Además de la clase time del modulo datetime, la biblioteca estandar de python tiene tambien otra módulo llamado time que nos proporciona funciones relacionadas con el tiempo. De este módulo ya vimos la función time() que nos proporciono una marca de tiempo de UNIX. Ahora vamos a ver otra función útil de este módulo como es sleep().

Se utiliza para parar la ejecución de un programa por un periodo de tiempo especificado. Puede ser útil en situaciones como:


1.- Controlar la velocidad de ejecuciónSi estás realizando operaciones intensivas en un bucle o en una sección de código y deseas limitar la velocidad a la que se ejecutan esas operaciones, puedes usar sleep() para agregar una pausa entre iteraciones.

sleep del módulo time

import time

for i in range(5):
    # Realizamos alguna tarea
    print(i)
    # Realizamos una pausa de 1 segundo entre class
    # las iteraciones.
    time.sleep(1)


  1. 2.- Sincronización de procesos: En aplicaciones donde múltiples procesos o hilos trabajan simultáneamente y necesitan sincronizarse, sleep() puede utilizarse para introducir una pausa controlada entre las operaciones de diferentes partes del código.
import threading

def proceso():
    print("Inicio del proceso")
    # Realizar algunas operaciones
    time.sleep(2)
    print("Fin del proceso")

thread = threading.Thread(target=proceso)
thread.start()

# Realizar otras operaciones mientras el hilo está en ejecución
print("Hilo principal realizando otras operaciones")

3.- Simulación de procesos en tiempo real: En casos donde se necesite simular la espera por eventos externos o procesos en tiempo real, sleep() puede ser útil para hacer pausas en la ejecución del programa.

import time

while True:
    # Realizar alguna tarea
    print("Esperando por un evento...")
    # Esperar 5 segundos antes de verificar nuevamente
    time.sleep(5)
Es importante tener en cuenta que sleep() suspende la ejecución del programa actual durante el tiempo especificado, por lo que puede bloquear otros procesos en el mismo hilo. En aplicaciones que requieren concurrencia, es posible que se prefiera el uso de asyncio.sleep() en lugar de time.sleep() para evitar bloqueos en programas asíncronos.


La función ctime.


El módulo time proporciona una función llamada ctime, que convierte el tiempo en segundos desde el 1 de enero de 1970. (marca de tiempo UNIX)

import time

t = time.time()
print(t)
print(time.ctime(t))
SALIDA:

1711144768.1780117
Fri Mar 22 21:59:28 2024

La función ctime devuelve una cadena para la marca de tiempo pasada. En nuestro ejemplo, la marca de tiempo expresa el 22 de marzo de 2024 a las 21:59:28.

También es posible llamar a la función ctime sin especificar el tiempo en segundos. En este caso, se devolverá la hora actual.

Las funciones gmtime() y localtime()


Algunas de las funciones disponibles en el modulo time requieren conocer la clase struct_time. Vamos a empezar viendo como es esta clase:

time.struct_time:
    tm_year   # Especifica el año.
    tm_mon    # Especifica el mes (valor de 1 a 12)
    tm_mday   # Especifica el día del mes (value from 1 to 31)
    tm_hour   # Especifica la hora (valor de 0 a 23)
    tm_min    # Especifica el minuto (valor de 0 a 59)
    tm_sec    # Especifica el segundo (valor de 0 a 61)
    tm_wday   # Especifica el día de la semana (valor de 0 a 6)
    tm_yday   # Especifica el día del año (valor de 1 a 366)
    tm_isdst  # Especifica si se aplica el horario de verano (1: sí, 0: no, -1: no se sabe)
    tm_zone   # Especifica el nombre de la zona horaria (valor en forma abreviada)
    tm_gmtoff # Especifica el desplazamiento al este del UTC (valor en segundos) 
La clase struct_time también permite el acceso a valores usando índices. El índice 0 devuelve el valor en tm_year, mientras que 8 devuelve el valor en tm_isdst.

Las excepciones son tm_zone y tm_gmoff, a las que no se puede acceder mediante índices. Veamos cómo usar la clase struct_time en la práctica. Ejecuta el código en el editor.

import time

t = time.time()
print(t)
print(time.gmtime(t))
print(time.localtime(t))
SALIDA:

1711298982.4769127 
time.struct_time(tm_year=2024, tm_mon=3, tm_mday=24, tm_hour=16, tm_min=49, tm_sec=42, tm_wday=6, tm_yday=84, tm_isdst=0) 
time.struct_time(tm_year=2024, tm_mon=3, tm_mday=24, tm_hour=16, tm_min=49, tm_sec=42, tm_wday=6, tm_yday=84, tm_isdst=0)

El ejemplo muestra dos funciones que convierten el tiempo transcurrido desde la época Unix al objeto struct_time. La diferencia entre ellos es que la función gmtime devuelve el objeto struct_time en UTC, mientras que la función localtime devuelve la hora local. Para la función gmtime, el atributo tm_isdst es siempre 0.


Las funciones asctime() y mktime().

El módulo time tiene funciones que esperan un objeto struct_time o una tupla que almacena valores de acuerdo con los índices presentados cuando se habla de la clase struct_time. Ejecuta el siguiente código:

import time

timestamp = 1572879180
st = time.gmtime(timestamp)

print(time.asctime(st))
print(time.mktime((2019, 11, 4, 14, 53, 0, 0, 308, 0)))
SALIDA:

Mon Nov  4 14:53:00 2019
1572879180.0

La primera de las funciones, llamada asctime, convierte un objeto struct_time o una tupla en una cadena. Toma en cuenta que la conocida función gmtime se usa para obtener el objeto struct_time. Si no se proporciona un argumento a la función asctime, se utilizará el tiempo devuelto por la función localtime.

La segunda función llamada mktime convierte un objeto struct_time o una tupla que expresa la hora local al número de segundos desde la época de Unix.


Creando objetos datetime.


En el módulo datetime, la fecha y la hora se pueden representar como objetos separados o como un solo objeto. La clase que combina fecha y hora se llama datetime.

datetime(year, month, day, hour, minute, second, microsecond, tzinfo, fold)

Vamos a ver como podemos crear un objeto del tipo datetime.

import datetime

fh = datetime.datetime(2024,3,25, 0, 9 , 30)
print(f"la fecha y hora son: {fh}")
print(f"La fecha es: {fh.date()}")
print(f"La hora es: {fh.time()}")
Salida:

la fecha y hora son: 2024-03-25 00:09:30
La fecha es: 2024-03-25
La hora es: 00:09:30

El ejemplo crea un objeto datetime que representa el 25 de marzo de 2024 a las 00:09:30. Todos los parámetros pasados al constructor van a ser atributos de clase de solo lectura. Son yearmonthdayhourminutesecondmicrosecondtzinfo, y fold.

El ejemplo muestra dos métodos que devuelven dos objetos diferentes. El método llamado date devuelve el objeto date con el año, mes y día dados, mientras que el método llamado time devuelve el objeto time con la hora y minuto dados.


Métodos que devuelven la fecha y hora actual.


La clase datetime tiene varios métodos que devuelven la fecha y hora actuales. Estos métodos son:
  • today(): devuelve la fecha y hora local actual con el atributo tzinfo establecido a None.
  • now(): devuelve la fecha y hora local actual igual que el método today, a menos que le pasemos el argumento opcional tz. El argumento de este método debe ser un objeto de la subclase tzinfo.
  • utcnow(): devuelve la fecha y hora UTC actual con el atributo tzinfo establecido a None.
Veámoslo con un ejemplo.

from datetime import datetime

print("hoy:", datetime.today())
print("ahora:", datetime.now())
print("utc_ahora:", datetime.utcnow())
Salida:

hoy: 2024-03-25 00:18:09.327818
ahora: 2024-03-25 00:18:09.328024
utc_ahora: 2024-03-24 23:18:09.328138


Obteniendo una marca de tiempo.


Para obtener una marca de tiempo a partir de una fecha en concreto podemos utilizar el método timestamp del módulo datetime

import datetime

dt = datetime.datetime(2024,3,25,23,51)
print(dt.timestamp())
SALIDA:

1711410660.0

El método timestamp devuelve un valor flotante que expresa el número de segundos transcurridos entre la fecha y la hora indicadas por el objeto datetime y el 1 de enero de 1970, 00:00:00 (UTC).

Dando formato a la fecha y a la hora.


Todas las clases que hemos visto hasta ahora del modulo datetime tienen un método llamado strftime, el cual nos permite devolver la fecha y la hora en el formato que le especifiquemos. 

El método strftime toma solo un argumento en forma de cadena que especifica un formato que puede constar de directivas.

Una directiva es una cadena que consta del caracter % (porcentaje) y una letra minúscula o mayuscula. Por ejemplo la directiva %Y significa el año con el siglo como número decimal. Vamos a verlo con un ejemplo.

from datetime import date

d = date(2023,3,25)
print(d.strftime('%d/%m/%Y'))
SALIDA:

25/03/2023

En el ejemplo hemos pasado un formato que consta de tres directivas separadas por una barra diagonal (/) al método strftime. El separador se puede reemplazar por otro caracter, o incluso por una cadena. 

Puede poner cualquier caracter en el formato pero solo las directivas reconocibles se sustituirán por sus correspondiente valores. Puede encontrar todas las directivas disponibles aquí.

El formato de hora funciona de la misma forma que el formato de fecha pero con las directivas adecuadas. Por ejemplo:

from datetime import time

t = time(0,7,30)
print(t.strftime('%H:%M:%S'))
SALIDA:

00:07:30

La función strftime() en el módulo time.


La función strftime() también está presente en el módulo time. No se diferencia mucho del disponible en el modulo datetime.

import time

timestamp = 1572879180
st = time.gmtime(timestamp)

print(time.strftime("%Y/%m/%d %H:%M:%S", st))
print(time.strftime("%Y/%m/%d %H:%M:%S"))
SALIDA

2019/11/04 14:53:00
2024/03/26 22:11:28

Puedes encontrar todas las directivas del módulo time aquí.


El método strptime().


A diferencia del método anterior strftime, crea un objeto datetime a partir de una cadena que representa una fecha y una hora.

El método strptime requiere que especifiques el formato en el que guardaste la fecha y la hora. Veámoslo con un ejemplo.

from datetime import datetime
print(datetime.strptime("2024/03/26 23:17:00", "%Y/%m/%d %H:%M:%S"))
SALIDA

2024-03-26 23:17:00

Hay que tener cuidado dado que si el formato que se especifica no coincide con la cadena se generará un ValueError.


Operaciones con la fecha y la hora.


Para realizar cálculos con la fecha y la hora existe una clase llamada timedelta. Un objeto timedelta se crea cuando se crea una operación con los objetos date o datetime. 

from datetime import date
from datetime import datetime

d1 = date(2024, 3, 26)
d2 = date(1974, 8, 7)

print(d1 - d2)

dt1 = datetime(2020, 11, 4, 0, 0, 0)
dt2 = datetime(2019, 11, 4, 14, 53, 0)

print(dt1 - dt2)
SALIDA

18129 days, 0:00:00
365 days, 9:07:00

Creando objetos TimeDelta.


Ya hemos visto que un objeto TimeDelta puede devolverse como resultado de restar dos objetos date o datetime. Pero también podemos crear un objeto TimeDelta nosotros mismos. Para ello vamos a familiarizarnos con los argumentos aceptados por el constructor de la clase que son:

  • days
  • seconds
  • microseconds
  • milliseconds
  • minutes
  • hours
  • weeks
Cada uno es opcional y el valor predeterminado es cero.

Los argumentos deben ser números enteros o de coma flotante, positivos o negativos. 

from datetime import timedelta

delta = timedelta(weeks=2, days=2, hours=3)
print(delta)
Salida:

16 days, 3:00:00

El resultado de 16 días se obtiene convirtiendo el argumento weeks en días (2 semanas = 14 días) y agregando el argumento days (2 días). Este es un comportamiento normal, porque el objeto timedelta solo almacena días, segundos y microsegundos internamente. De manera similar, el argumento hora se convierte en minutos. Echa un vistazo al siguiente ejemplo:

from datetime import timedelta
 
delta = timedelta(weeks=2, days=2, hours=3)
print("Días:", delta.days)
print("Segundos:", delta.seconds)
print("Microsegundos:", delta.microseconds)
Salida:

Días: 16
Segundos: 10800
Microsegundos: 0

El resultado de 10800 se obtiene convirtiendo 3 horas en segundos. De esta forma el objeto timedelta almacena los argumentos pasados durante su creación. Las semanas se convierten en días, las horas y los minutos en segundos y los milisegundos en microsegundos.

Ya sabes cómo el objeto timedelta almacena los argumentos pasados internamente. Veamos cómo se puede utilizar en la práctica.

Observa algunas operaciones admitidas por las clases del módulo datetime. Observa el siguiente código:

from datetime import datetime

delta = timedelta(weeks=2, days=2, hours=2)
print(delta)

delta2 = delta * 2
print(delta2)

d = date(2019, 10, 4) + delta2
print(d)

dt = datetime(2019, 10, 4, 14, 53) + delta2
print(dt)
Salida:

16 days, 2:00:00
32 days, 4:00:00
2019-11-05
2019-11-05 18:53:00


El módulo calendar.


Vamos a verlo de manera resumida. 

1.- En el módulo calendar los días de la semana se muestran de lunes a domingo. Cada día de la semana tiene su representación en forma de número entero, donde el primer día de la semana, el lunes, está representado por el valor 0, mientras que el último día de la semana, el domingo, está representado por el valor 6.

2.- Para mostrar un calendario de cualquier año, se emplea la función calendar, pasándole el año como argumento. Por ejemplo:

import calendar

print(calendar.calendar(2024))
Salida:


                                  2024

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7                1  2  3  4                   1  2  3
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       4  5  6  7  8  9 10
15 16 17 18 19 20 21      12 13 14 15 16 17 18      11 12 13 14 15 16 17
22 23 24 25 26 27 28      19 20 21 22 23 24 25      18 19 20 21 22 23 24
29 30 31                  26 27 28 29               25 26 27 28 29 30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7             1  2  3  4  5                      1  2
 8  9 10 11 12 13 14       6  7  8  9 10 11 12       3  4  5  6  7  8  9
15 16 17 18 19 20 21      13 14 15 16 17 18 19      10 11 12 13 14 15 16
22 23 24 25 26 27 28      20 21 22 23 24 25 26      17 18 19 20 21 22 23
29 30                     27 28 29 30 31            24 25 26 27 28 29 30

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7                1  2  3  4                         1
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       2  3  4  5  6  7  8
15 16 17 18 19 20 21      12 13 14 15 16 17 18       9 10 11 12 13 14 15
22 23 24 25 26 27 28      19 20 21 22 23 24 25      16 17 18 19 20 21 22
29 30 31                  26 27 28 29 30 31         23 24 25 26 27 28 29
                                                    30

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6                   1  2  3                         1
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       2  3  4  5  6  7  8
14 15 16 17 18 19 20      11 12 13 14 15 16 17       9 10 11 12 13 14 15
21 22 23 24 25 26 27      18 19 20 21 22 23 24      16 17 18 19 20 21 22
28 29 30 31               25 26 27 28 29 30         23 24 25 26 27 28 29
                                                    30 31

Como alternativa a lo anterior, podemos utilizar la función prcal (calendar.prcal(año), que toma los mismo parámetros que la función calendar, pero no requiere el uso de print para imprimir el formulario.

3.- Para mostrar el calendario de cualquier mes del año, se emplea la función month pasándole el año y el mes. Por ejemplo:

import calendar

print(calendar.month(2024, 3))
Salida:

     March 2024
Mo Tu We Th Fr Sa Su
             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
O también puedes usar la función prmonth.

4.- La función setfirstweekday te permite cambiar el primer día de la semana. Toma un valor de 0 a 6 donde el 0 es el Lunes y 6 es el Domingo.

Por ejemplo si queremos que la semana empieze el Domingo utilizaremos el siguiente código:

import calendar

calendar.setfirstweekday(6)
# también se puede utilizar calendar.DIASEMANA
# calendar.setfirstweekday(calendar.SUNDAY)
calendar.prmonth(2024, 3)
Salida:

     March 2024
Su Mo Tu We Th Fr Sa
                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

5.- La función weekday es el día de la semana para un año, mes y día determinado pasado por argumento.

Por ejemplo para saber que día de la semana nació Leonardo Da Vinci (15.04.1542)

import calendar

print(calendar.weekday(1452,4,15))

Salida:

3 # Se corresponde con el Jueves.

6.- La función weekheader devuelve los nombres de los días de la semana en forma abreviada. Se requiere que se pase como argumento el ancho en caracteres de un día de la semana.

import calendar

print(calendar.weekheader(1))
print(calendar.weekheader(3))
print(calendar.weekheader(5))
print(calendar.weekheader(10))
Salida:

M T W T F S S
Mon Tue Wed Thu Fri Sat Sun
Mon   Tue   Wed   Thu   Fri   Sat   Sun 
Monday    Tuesday   Wednesday   Thursday    Friday    Saturday    Sunday

7.- Una función útil es isleap, que nos permite saber si un año es bisiesto o no.

import calendar

print(calendar.isleap(2024))
Salida:

True

8.- Podemos crear un objeto calendar usando la clase Calendar, que al crear el objeto te permite cambiar el primer día de la semana con el parámetro opcional firstweekday, por ejemplo:

import calendar
 
c = calendar.Calendar(2)
 
for weekday in c.iterweekdays():
    print(weekday, end=" ")
Salida:

2 3 4 5 6 0 1 

iterweekdays devuelve un iterador para los números de los días de la semana. El primer valor devuelto siempre es igual al valor de la propiedad firstweekday.