Frage Python-Datum des vorherigen Monats


Ich versuche, das Datum des vorherigen Monats mit Python zu erhalten. Hier ist, was ich versucht habe:

str( time.strftime('%Y') ) + str( int(time.strftime('%m'))-1 )

Allerdings ist dieser Weg aus zwei Gründen schlecht: Erstens gibt er 20122 für Februar 2012 (statt 201202) zurück und zweitens gibt er 0 statt 12 im Januar zurück.

Ich habe dieses Problem in bash mit gelöst

echo $(date -d"3 month ago" "+%G%m%d")

Ich denke, wenn Bash einen eingebauten Weg für diesen Zweck hat, dann sollte Python, viel mehr ausgestattet, etwas Besseres bieten als das Schreiben eines eigenen Skripts, um dieses Ziel zu erreichen. Natürlich könnte ich etwas tun wie:

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)

Ich habe diesen Code nicht getestet und möchte ihn auch nicht verwenden (außer ich kann keinen anderen Weg finden: /)

Danke für Ihre Hilfe!


74
2018-03-15 17:22


Ursprung


Antworten:


Terminzeit und die datetime.timedelta Klassen sind dein Freund.

  1. finde heute.
  2. Verwenden Sie das, um den ersten Tag dieses Monats zu finden.
  3. Verwenden Sie timedelta, um einen einzelnen Tag bis zum letzten Tag des vorherigen Monats zu sichern.
  4. Drucken Sie die YYYYMM-Zeichenfolge, die Sie suchen.

So was:

 >>> import datetime
 >>> today = datetime.date.today()
 >>> first = today.replace(day=1)
 >>> lastMonth = first - datetime.timedelta(days=1)
 >>> print lastMonth.strftime("%Y%m")
 201202
 >>>

179
2018-03-15 17:35



Du solltest benutzen Datum. Damit können Sie relateddelta verwenden, es ist eine verbesserte Version von timedelta.

>>> import datetime 
>>> import dateutil.relativedelta
>>> now = datetime.datetime.now()
>>> print now
2012-03-15 12:33:04.281248
>>> print now + dateutil.relativedelta.relativedelta(months=-1)
2012-02-15 12:33:04.281248

41
2018-03-15 17:35



from datetime import date, timedelta

first_day_of_current_month = date.today().replace(day=1)
last_day_of_previous_month = first_day_of_current_month - timedelta(days=1)

print "Previous month:", last_day_of_previous_month.month

Oder:

from datetime import date, timedelta

prev = date.today().replace(day=1) - timedelta(days=1)
print prev.month

37
2017-11-02 16:41



Aufbauend auf bgporters Antwort.

def prev_month_range(when = None): 
    """Return (previous month's start date, previous month's end date)."""
    if not when:
        # Default to today.
        when = datetime.datetime.today()
    # Find previous month: https://stackoverflow.com/a/9725093/564514
    # Find today.
    first = datetime.date(day=1, month=when.month, year=when.year)
    # Use that to find the first day of this month.
    prev_month_end = first - datetime.timedelta(days=1)
    prev_month_start = datetime.date(day=1, month= prev_month_end.month, year= prev_month_end.year)
    # Return previous month's start and end dates in YY-MM-DD format.
    return (prev_month_start.strftime('%Y-%m-%d'), prev_month_end.strftime('%Y-%m-%d'))

5
2018-05-09 14:41



def prev_month(date=datetime.datetime.today()):
    if date.month == 1:
        return date.replace(month=12,year=date.year-1)
    else:
        try:
            return date.replace(month=date.month-1)
        except ValueError:
            return prev_month(date=date.replace(day=date.day-1))

2
2017-10-29 11:34



Es ist sehr einfach und einfach. Mach das

from dateutil.relativedelta import relativedelta
from datetime import datetime

today_date = datetime.today()
print "todays date time: %s" %today_date

one_month_ago = today_date - relativedelta(months=1)
print "one month ago date time: %s" % one_month_ago
print "one month ago date: %s" % one_month_ago.date()

Hier ist die Ausgabe: $ python2.7 main.py

todays date time: 2016-09-06 02:13:01.937121
one month ago date time: 2016-08-06 02:13:01.937121
one month ago date: 2016-08-06

2
2017-09-02 06:40



Nur zum Spaß, eine reine mathematische Antwort mit divmod. Ziemlich innecient wegen der Multiplikation, könnte genauso gut eine einfache Überprüfung der Anzahl der Monate (wenn gleich 12, Jahr, etc.)

year = today.year
month = today.month

nm = list(divmod(year * 12 + month + 1, 12))
if nm[1] == 0:
    nm[1] = 12
    nm[0] -= 1
pm = list(divmod(year * 12 + month - 1, 12))
if pm[1] == 0:
    pm[1] = 12
    pm[0] -= 1

next_month = nm
previous_month = pm

1
2017-08-28 22:01



Aufbauend auf den Kommentar von @ J.F. Sebastian, du kannst die Kette verketten replace() Funktion, um einen "Monat" zurückzugehen. Da ein Monat keine konstante Zeitspanne ist, versucht diese Lösung, zum gleichen Datum des vorherigen Monats zurückzukehren, was natürlich nicht für alle Monate funktioniert. In diesem Fall wird standardmäßig der letzte Tag des vorherigen Monats verwendet.

from datetime import datetime, timedelta

d = datetime(2012, 3, 31) # A problem date as an example

# last day of last month
one_month_ago = (d.replace(day=1) - timedelta(days=1))
try:
    # try to go back to same day last month
    one_month_ago = one_month_ago.replace(day=d.day)
except ValueError:
    pass
print("one_month_ago: {0}".format(one_month_ago))

Ausgabe:

one_month_ago: 2012-02-29 00:00:00

0
2017-07-15 22:18



Das hat für mich funktioniert:

import datetime
today = datetime.date.today()
last_month = today.replace(month=today.month-1, day=1)

0
2018-04-19 17:46