Estoy tratando de obtener la fecha del mes anterior con python. Esto es lo que he intentado:
str( time.strftime('%Y') ) + str( int(time.strftime('%m'))-1 )
Sin embargo, de esta manera es malo por 2 razones: primero devuelve 20122 para febrero de 2012 (en lugar de 201202) y, en segundo lugar, devolverá 0 en lugar de 12 en enero.
He resuelto este problema en bash con
echo $(date -d"3 month ago" "+%G%m%d")
Creo que si bash tiene una forma integrada para este propósito, entonces python, mucho más equipado, debería proporcionar algo mejor que forzar la escritura del propio script para lograr este objetivo. Por supuesto que podría hacer algo como:
if int(time.strftime('%m')) == 1:
return '12'
else:
if int(time.strftime('%m')) < 10:
return '0'+str(time.strftime('%m')-1)
else:
return str(time.strftime('%m') -1)
No he probado este código y no quiero usarlo de todos modos (a menos que no pueda encontrar otra forma: /)
¡Gracias por tu ayuda!
Respuestas:
datetime y las clases datetime.timedelta son tu amigo.
Me gusta esto:
201202
está impreso.fuente
.replace()
método:datetime.utcnow().replace(day=1) - timedelta(days=1)
.replace()
función. Hágalo una vez para obtener el último mes, luego hágalo nuevamente para obtener el día que desea. Primero:d = date.today()
luegoone_month_ago = (d.replace(day=1) - timedelta(days=1)).replace(day=d.day)
calendar
y usandocalendar.mdays[d.month-1]
y más fealdad en unamin()
función en la segundareplace
, pero parece poco pitón y no tiene en cuenta los casos de esquina. He actualizado mi respuesta a continuación usandotry - except
qué cuentas para todos los casos, aunque odio usar excepciones como parte de un algoritmo.Deberías usar dateutil . Con eso, puedes usar relativedelta, es una versión mejorada de timedelta.
fuente
O:
fuente
Sobre la base de la respuesta de bgporter .
fuente
Es muy fácil y sencillo. Hacer esto
Aquí está el resultado: $ python2.7 main.py
fuente
Para alguien que llegó aquí y busca obtener el primer y el último día del mes anterior:
Salida:
fuente
Calendar
módulo: stackabuse.com/introduction-to-the-python-calendar-modulefuente
Solo por diversión, una respuesta matemática pura usando divmod. Bastante ineficiente debido a la multiplicación, podría ser igual de simple verificar el número de meses (si es igual a 12, aumentar año, etc.)
fuente
Con la biblioteca muy completa Pendulum , tenemos el
subtract
método (y no "subStract"):Vemos que maneja años saltando.
El equivalente inverso es
add
.https://pendulum.eustace.io/docs/#addition-and-subtraction
fuente
A partir del comentario de @JF Sebastian, puede encadenar la
replace()
función para retroceder un "mes". Dado que un mes no es un período de tiempo constante, esta solución intenta volver a la misma fecha del mes anterior, que por supuesto no funciona en todos los meses. En tal caso, este algoritmo se predetermina al último día del mes anterior.Salida:
fuente
Si desea ver las letras ASCII en un archivo de tipo EXE en un entorno LINUX / UNIX, intente "od -c 'filename' | more"
Probablemente obtendrá muchos elementos irreconocibles, pero todos se presentarán, y se mostrarán las representaciones HEX, y los caracteres equivalentes ASCII (si corresponde) seguirán la línea de códigos hexadecimales. Pruébelo en un código compilado que conozca. Puede ver cosas que reconoce.
fuente
Hay una biblioteca de alto nivel
dateparser
que puede determinar la fecha pasada dado el lenguaje natural y devolver eldatetime
objeto Python correspondientefuente