วิธีที่ง่ายที่สุดในการลบเดือนออกจากวันที่ใน Python คืออะไร?


105

หากเฉพาะ timedelta มีอาร์กิวเมนต์เดือนในตัวสร้าง แล้ววิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?

แก้ไข:ฉันไม่ได้คิดหนักเกินไปเกี่ยวกับเรื่องนี้ตามที่ระบุไว้ด้านล่าง สิ่งที่ฉันต้องการจริงๆคือวันใดก็ได้ในเดือนที่แล้วเพราะในที่สุดฉันก็จะคว้าปีและเดือนเท่านั้น ดังนั้นเมื่อพิจารณาจากวัตถุวันที่และเวลาวิธีที่ง่ายที่สุดในการส่งคืนวัตถุวันที่และเวลาที่อยู่ในเดือนก่อนหน้าคืออะไร?

คำตอบ:


64

ลองสิ่งนี้:

def monthdelta(date, delta):
    m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
    if not m: m = 12
    d = min(date.day, [31,
        29 if y%4==0 and (not y%100==0 or y%400 == 0) else 28,
        31,30,31,30,31,31,30,31,30,31][m-1])
    return date.replace(day=d,month=m, year=y)

>>> for m in range(-12, 12):
    print(monthdelta(datetime.now(), m))

    
2009-08-06 16:12:27.823000
2009-09-06 16:12:27.855000
2009-10-06 16:12:27.870000
2009-11-06 16:12:27.870000
2009-12-06 16:12:27.870000
2010-01-06 16:12:27.870000
2010-02-06 16:12:27.870000
2010-03-06 16:12:27.886000
2010-04-06 16:12:27.886000
2010-05-06 16:12:27.886000
2010-06-06 16:12:27.886000
2010-07-06 16:12:27.886000
2010-08-06 16:12:27.901000
2010-09-06 16:12:27.901000
2010-10-06 16:12:27.901000
2010-11-06 16:12:27.901000
2010-12-06 16:12:27.901000
2011-01-06 16:12:27.917000
2011-02-06 16:12:27.917000
2011-03-06 16:12:27.917000
2011-04-06 16:12:27.917000
2011-05-06 16:12:27.917000
2011-06-06 16:12:27.933000
2011-07-06 16:12:27.933000
>>> monthdelta(datetime(2010,3,30), -1)
datetime.datetime(2010, 2, 28, 0, 0)
>>> monthdelta(datetime(2008,3,30), -1)
datetime.datetime(2008, 2, 29, 0, 0)

แก้ไขแก้ไขเพื่อจัดการกับวันเช่นกัน

แก้ไขดูคำตอบจากการไขปริศนาซึ่งชี้ให้เห็นการคำนวณที่ง่ายกว่าสำหรับd:

d = min(date.day, calendar.monthrange(y, m)[1])

ถ้าฉันใช้งานได้ถูกต้อง((date.month+delta-1) % 12)+1และหมายความว่าif not m: m = 12สามารถเอาออกได้
Charles L.

@ dan-klasson ละเอียดได้ไหม
Jean-François Fabre

@ Jean-FrançoisFabreคนแรกไม่ง่าย นอกจากนี้คุณสามารถทำได้อย่างง่ายดายด้วย datetime และ timedelta
dan-klasson

ใช่หลังจาก OP แก้ไขแล้วจะเห็นได้ชัดว่าสิ่งที่พวกเขาต้องการสามารถทำได้โดยdt - timedelta(days=dt.day)ใช้วลีเดิมแม้ว่าจะฟังดูเหมือนว่าพวกเขาต้องการที่จะสามารถลบจำนวนเดือนโดยพลการและนั่นก็ยากกว่าเล็กน้อย
Duncan

ผมคิดว่าการคำนวณสำหรับปีอธิกสุรทินไม่ถูกต้อง - 29 if y%4==0 and (not y%100==0 or y%400 == 0) else 28มันควรจะเป็น เช่น 1600 เป็นปีอธิกสุรทินในขณะที่ปี 1700 ไม่ใช่
Shawn Loewen

191

คุณสามารถใช้dateutilโมดูลของบุคคลที่สามได้(รายการ PyPI ที่นี่ )

import datetime
import dateutil.relativedelta

d = datetime.datetime.strptime("2013-03-31", "%Y-%m-%d")
d2 = d - dateutil.relativedelta.relativedelta(months=1)
print d2

เอาท์พุท:

2013-02-28 00:00:00

1
ฉันสับสนกับพารามิเตอร์monthและmonthsใน dateutil ลบด้วยพารามิเตอร์monthไม่ได้ผล แต่ใช้monthsงานได้ In [23]: created_datetime__lt - relativedelta(months=1) Out[23]: datetime.datetime(2016, 11, 29, 0, 0, tzinfo=<StaticTzInfo 'Etc/GMT-8'>) In [24]: created_datetime__lt - relativedelta(month=1) Out[24]: datetime.datetime(2016, 1, 29, 0, 0, tzinfo=<StaticTzInfo 'Etc/GMT-8'>)
Simin Jie

2
@SiminJie: ฉันคิดว่าการใช้monthsจะสร้างความแตกต่างใน 1 เดือน การใช้monthจะตั้งค่าเดือนเป็น 1 (เช่นมกราคม) โดยไม่คำนึงถึงเดือนที่ป้อนข้อมูล
Frank Meulenaar

76

หลังจากคำถามเดิมแก้ไข "วัตถุวันที่และเวลาใด ๆ ในเดือนก่อนหน้า" คุณสามารถทำได้อย่างง่ายดายโดยการลบ 1 วันจากวันแรกของเดือน

from datetime import datetime, timedelta

def a_day_in_previous_month(dt):
   return dt.replace(day=1) - timedelta(days=1)

5
คุณสามารถใช้ได้dt.replace(day=1) - timedelta(1)
jfs

3
หรือdt - timedelta(days=dt.day)
SergiyKolesnikov

27

วิธีแก้ปัญหาแพนด้าแบบเวกเตอร์นั้นง่ายมาก:

df['date'] - pd.DateOffset(months=1)


ขอขอบคุณ! มันช่วยให้ฉันเพิ่ม / ลบหนึ่งเดือนไปยัง / จากชุดวันที่ของฉันได้อย่างง่ายดาย!
Mateus da Silva Teixeira

pandasนี้เป็นสิ่งที่ดีถ้าคุณสามารถใช้ ขอบคุณ!
igorkf

25

การเปลี่ยนแปลงในคำตอบของ Duncan (ฉันไม่มีชื่อเสียงเพียงพอที่จะแสดงความคิดเห็น) ซึ่งใช้ calendar.monthrange เพื่อลดความซับซ้อนของการคำนวณของวันสุดท้ายของเดือน:

import calendar
def monthdelta(date, delta):
    m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
    if not m: m = 12
    d = min(date.day, calendar.monthrange(y, m)[1])
    return date.replace(day=d,month=m, year=y)

ข้อมูลเกี่ยวกับเดือนจากรับวันสุดท้ายของเดือนใน Python


ฉันคิดว่าคุณสามารถแทนที่สองบรรทัดแรกของฟังก์ชันด้วยสิ่งเหล่านี้ได้y, m = divmod(date.year * 12 + date.month + delta - 1, 12); m += 1หากสิ่งนั้นดูสะอาดกว่าสำหรับคุณ
Jeremiah England

17

หากเฉพาะ timedelta มีอาร์กิวเมนต์เดือนในตัวสร้าง แล้ววิธีที่ง่ายที่สุดในการทำคืออะไร?

คุณต้องการให้ผลลัพธ์เป็นอย่างไรเมื่อคุณลบเดือนออกจากวันที่คือวันที่ 30 มีนาคม นั่นคือปัญหาในการบวกหรือลบเดือน: เดือนมีความยาวต่างกัน! ในบางแอปพลิเคชันมีข้อยกเว้นที่เหมาะสมในกรณีเช่นนี้ส่วน "วันสุดท้ายของเดือนก่อนหน้า" สามารถใช้ได้ในบางกรณี (แต่นั่นเป็นเลขคณิตที่บ้าคลั่งอย่างแท้จริงเมื่อลบเดือนแล้วการเพิ่มเดือนนั้นไม่ได้เป็นการไม่ดำเนินการโดยรวม!) ในส่วนอื่น ๆ คุณจะต้องเก็บไว้นอกเหนือจากวันที่ที่มีข้อบ่งชี้บางอย่างเกี่ยวกับข้อเท็จจริงเช่น "ฉันกำลังบอกว่า 28 ก.พ. แต่ฉันอยากให้วันที่ 30 ก.พ. เป็นจริง" ดังนั้นการเพิ่มหรือลบเดือนอื่นเป็น ที่สามารถตั้งค่าสิ่งต่างๆได้อีกครั้ง (และอย่างหลังต้องใช้คลาสแบบกำหนดเองที่มีข้อมูลบวก s / อย่างอื่น)

ไม่มีวิธีแก้ปัญหาที่แท้จริงที่สามารถใช้ได้กับทุกแอปพลิเคชันและคุณยังไม่ได้บอกเราว่าความต้องการของแอปเฉพาะของคุณคืออะไรสำหรับความหมายของการดำเนินการที่เลวร้ายนี้ดังนั้นจึงไม่มีความช่วยเหลือเพิ่มเติมที่เราสามารถให้ได้ที่นี่


คุณพูดถูกจริงๆ เป็นเพียงการล้อเล่นเกี่ยวกับเวลาที่มีข้อโต้แย้งในเรื่องนั้น ฉันสงสัยว่าตรรกะเดียวกันนี้ใช้กับการไม่มีข้อโต้แย้งเป็นเวลาหลายชั่วโมงหรือนาที ในทางเทคนิคหนึ่งวันไม่ใช่ 24 ชั่วโมงอย่างแน่นอน
Bialecki

PHP จะจัดการโดยเพิ่มอีก 2 วันเป็นวันที่ 28 กุมภาพันธ์และไปถึงวันที่ 2 มีนาคม มีการประชุมสำหรับสิ่งนี้ขอให้ฉันพบพวกเขาอย่างรวดเร็ว
NullUserException

จะน่าสนใจยิ่งขึ้นหากคุณกำลังคำนวณวันที่สำหรับการแลกเปลี่ยนสกุลเงินเช่นคุณอาจต้องหาวันที่บอกว่า 3 หรือ 6 เดือนในอนาคต แต่ต้องเป็นวันทำการในทั้งสองประเทศด้วย (ไม่ใช่วันศุกร์ในประเทศมุสลิม) และไม่ใช่วันหยุดธนาคารในประเทศใดประเทศหนึ่ง
Duncan

@Bialecki: datetimeโมดูลสมมติว่าวันคือ 24 ชั่วโมง (ไม่มีอธิกวินาที)
jfs

11

ฉันคิดว่าวิธีง่ายๆคือการใช้ DateOffset จาก Pandas ดังนี้:

import pandas as pd
date_1 = pd.to_datetime("2013-03-31", format="%Y-%m-%d") - pd.DateOffset(months=1)

ผลลัพธ์จะเป็นวัตถุวันที่และเวลา


2
นั่นเป็นวิธีแก้ปัญหาที่ใช้งานง่ายที่สุด
Kots

7

หากสิ่งที่คุณต้องการคือวันใดก็ได้ในเดือนที่แล้วสิ่งที่ง่ายที่สุดที่คุณทำได้คือลบจำนวนวันออกจากวันที่ปัจจุบันซึ่งจะทำให้คุณเป็นวันสุดท้ายของเดือนก่อนหน้า

ตัวอย่างเช่นเริ่มต้นด้วยวันที่ใดก็ได้:

>>> import datetime                                                                                                                                                                 
>>> today = datetime.date.today()                                                                                                                                                   
>>> today
datetime.date(2016, 5, 24)

การลบวันของวันที่ปัจจุบันที่เราได้รับ:

>>> last_day_previous_month = today - datetime.timedelta(days=today.day)
>>> last_day_previous_month
datetime.date(2016, 4, 30)

เพียงพอสำหรับความต้องการที่เรียบง่ายของคุณในวันใด ๆ ในเดือนที่แล้ว

แต่ตอนนี้คุณมีแล้วคุณยังสามารถรับวันใดก็ได้ในเดือนรวมถึงวันเดียวกันกับที่คุณเริ่มต้นด้วย (เช่นมากหรือน้อยเท่ากับการลบเดือน):

>>> same_day_last_month = last_day_previous_month.replace(day=today.day)
>>> same_day_last_month
datetime.date(2016, 4, 24)

แน่นอนว่าคุณต้องระวังวันที่ 31 ในเดือน 30 วันหรือวันที่ขาดหายไปจากเดือนกุมภาพันธ์ (และดูแลปีอธิกสุรทิน) แต่ก็ทำได้ง่ายเช่นกัน:

>>> a_date = datetime.date(2016, 3, 31)                                                                                                                                             
>>> last_day_previous_month = a_date - datetime.timedelta(days=a_date.day)
>>> a_date_minus_month = (
...     last_day_previous_month.replace(day=a_date.day)
...     if a_date.day < last_day_previous_month.day
...     else last_day_previous_month
... )
>>> a_date_minus_month
datetime.date(2016, 2, 29)

2

ส่งคืนวันสุดท้ายของเดือนที่แล้ว:

>>> import datetime
>>> datetime.datetime.now() - datetime.timedelta(days=datetime.datetime.now().day)
datetime.datetime(2020, 9, 30, 14, 13, 15, 67582)

ส่งคืนวันเดียวกันของเดือนที่แล้ว:

>>> x = datetime.datetime.now() - datetime.timedelta(days=datetime.datetime.now().day)
>>> x.replace(day=datetime.datetime.now().day)
datetime.datetime(2020, 9, 7, 14, 22, 14, 362421)

1

ฉันใช้สิ่งนี้สำหรับปีงบประมาณของรัฐบาลโดยไตรมาสที่ 4 เริ่มวันที่ 1 ตุลาคม หมายเหตุฉันแปลงวันที่เป็นไตรมาสและเลิกทำด้วย

import pandas as pd

df['Date'] = '1/1/2020'
df['Date'] = pd.to_datetime(df['Date'])              #returns 2020-01-01
df['NewDate'] = df.Date - pd.DateOffset(months=3)    #returns 2019-10-01 <---- answer

# For fun, change it to FY Quarter '2019Q4'
df['NewDate'] = df['NewDate'].dt.year.astype(str) + 'Q' + df['NewDate'].dt.quarter.astype(str)

# Convert '2019Q4' back to 2019-10-01
df['NewDate'] = pd.to_datetime(df.NewDate)


1

วิธีที่ง่ายที่สุดที่ฉันได้ลองเมื่อกี้

from datetime import datetime
from django.utils import timezone





current = timezone.now()
if current.month == 1:
     month = 12
else:
     month = current.month - 1
current = datetime(current.year, month, current.day)

1

สิ่งที่เกี่ยวกับ:

from datetime import timedelta, date

current_date =date.today()
current_month = current_date.month
today_a_month_ago = date(current_date.year, current_month - 1, current_date.day)

ดูเหมือนจะง่ายที่สุดสำหรับฉัน


นั่นเป็นทางออกที่ยอดเยี่ยม! คุณจะต้องแก้ไขที่ไม่ได้กำหนดaนี้
Artur

ขอขอบคุณที่ชี้ว่าควรจะเท่ากับa current_dateฉันจะแก้ไขเดี๋ยวนี้ :)
Luis Chaves Rodriguez

0

นี่คือโค้ดบางส่วนที่ต้องทำ ยังไม่ได้ลองเอง ...

def add_one_month(t):
    """Return a `datetime.date` or `datetime.datetime` (as given) that is
    one month earlier.

    Note that the resultant day of the month might change if the following
    month has fewer days:

        >>> add_one_month(datetime.date(2010, 1, 31))
        datetime.date(2010, 2, 28)
    """
    import datetime
    one_day = datetime.timedelta(days=1)
    one_month_later = t + one_day
    while one_month_later.month == t.month:  # advance to start of next month
        one_month_later += one_day
    target_month = one_month_later.month
    while one_month_later.day < t.day:  # advance to appropriate day
        one_month_later += one_day
        if one_month_later.month != target_month:  # gone too far
            one_month_later -= one_day
            break
    return one_month_later

def subtract_one_month(t):
    """Return a `datetime.date` or `datetime.datetime` (as given) that is
    one month later.

    Note that the resultant day of the month might change if the following
    month has fewer days:

        >>> subtract_one_month(datetime.date(2010, 3, 31))
        datetime.date(2010, 2, 28)
    """
    import datetime
    one_day = datetime.timedelta(days=1)
    one_month_earlier = t - one_day
    while one_month_earlier.month == t.month or one_month_earlier.day > t.day:
        one_month_earlier -= one_day
    return one_month_earlier

0

ให้ทูเปิล (ปีเดือน) โดยที่เดือนจะเริ่มจาก 1-12 ให้ลองทำดังนี้

>>> from datetime import datetime
>>> today = datetime.today()
>>> today
datetime.datetime(2010, 8, 6, 10, 15, 21, 310000)
>>> thismonth = today.year, today.month
>>> thismonth
(2010, 8)
>>> lastmonth = lambda (yr,mo): [(y,m+1) for y,m in (divmod((yr*12+mo-2), 12),)][0]
>>> lastmonth(thismonth)
(2010, 7)
>>> lastmonth( (2010,1) )
(2009, 12)

สมมติว่ามี 12 เดือนในทุกปี


0
def month_sub(year, month, sub_month):
    result_month = 0
    result_year = 0
    if month > (sub_month % 12):
        result_month = month - (sub_month % 12)
        result_year = year - (sub_month / 12)
    else:
        result_month = 12 - (sub_month % 12) + month
        result_year = year - (sub_month / 12 + 1)
    return (result_year, result_month)

>>> month_sub(2015, 7, 1)    
(2015, 6)
>>> month_sub(2015, 7, -1)
(2015, 8)
>>> month_sub(2015, 7, 13)
(2014, 6)
>>> month_sub(2015, 7, -14)
(2016, 9)

0

ฉันใช้รหัสต่อไปนี้เพื่อย้อนกลับไป n เดือนจากวันที่ระบุ:

your_date =  datetime.strptime(input_date, "%Y-%m-%d")  #to convert date(2016-01-01) to timestamp
start_date=your_date    #start from current date

#Calculate Month
for i in range(0,n):    #n = number of months you need to go back
    start_date=start_date.replace(day=1)    #1st day of current month
    start_date=start_date-timedelta(days=1) #last day of previous month

#Calculate Day
if(start_date.day>your_date.day):   
    start_date=start_date.replace(day=your_date.day)            

print start_date

เช่น: input date = 28/12/2015 คำนวณวันที่ก่อนหน้า 6 เดือน

I) คำนวณเดือน: ขั้นตอนนี้จะให้วันที่เริ่มต้นเป็นวันที่ 30/06/2015
บันทึกว่าหลังจากขั้นตอนการคำนวณเดือนคุณจะได้รับวันสุดท้ายของเดือนที่ต้องการ

II) CALCULATE DAY: เงื่อนไขถ้า (start_date.day> your_date.day) ตรวจสอบว่าวันจาก input_date มีอยู่ในเดือนที่ต้องการหรือไม่ สิ่งนี้จัดการเงื่อนไขที่วันที่ป้อนข้อมูลคือ 31 (หรือ 30) และเดือนที่ต้องการมีน้อยกว่า 31 (หรือ 30 ในกรณีของกุมภาพันธ์) วัน รองรับกรณีอธิกปีเช่นกัน (สำหรับ ก.พ. ) หลังจากขั้นตอนนี้คุณจะได้ผลลัพธ์เป็น 28/06/2015

หากไม่เป็นไปตามเงื่อนไขนี้ start_date จะยังคงเป็นวันที่สุดท้ายของเดือนก่อนหน้า ดังนั้นหากคุณให้ 31/12/2015 เป็นวันที่ป้อนข้อมูลและต้องการวันที่ก่อนหน้า 6 เดือนก็จะให้วันที่ 30/06/2015


0

คุณสามารถใช้ฟังก์ชันที่ระบุด้านล่างเพื่อรับวันที่ก่อน / หลัง X เดือน

จากวันที่นำเข้าวันที่และเวลา

def next_month (given_date, month):
    yyyy = int (((given_date.year * 12 + given_date.month) + เดือน) / 12)
    mm = int (((given_date.year * 12 + given_date.month) + เดือน)% 12)

    ถ้า mm == 0:
        ปปปป - = 1
        มม. = 12

    ส่งคืน given_date.replace (year = yyyy, month = mm)


ถ้า __name__ == "__main__":
    วันนี้ = date.today ()
    พิมพ์ (วันนี้)

    สำหรับ mm in [-12, -1, 0, 1, 2, 12, 20]:
        next_date = next_month (วันนี้มม.)
        พิมพ์ (next_date)

0

ฉันคิดว่าคำตอบนี้ค่อนข้างอ่านได้:

def month_delta(dt, delta):
    year_delta, month = divmod(dt.month + delta, 12)

    if month == 0:
        # convert a 0 to december
        month = 12
        if delta < 0:
            # if moving backwards, then it's december of last year
            year_delta -= 1

    year = dt.year + year_delta

    return dt.replace(month=month, year=year)

for delta in range(-20, 21):
    print(delta, "->", month_delta(datetime(2011, 1, 1), delta))

-20 -> 2009-05-01 00:00:00
-19 -> 2009-06-01 00:00:00
-18 -> 2009-07-01 00:00:00
-17 -> 2009-08-01 00:00:00
-16 -> 2009-09-01 00:00:00
-15 -> 2009-10-01 00:00:00
-14 -> 2009-11-01 00:00:00
-13 -> 2009-12-01 00:00:00
-12 -> 2010-01-01 00:00:00
-11 -> 2010-02-01 00:00:00
-10 -> 2010-03-01 00:00:00
-9 -> 2010-04-01 00:00:00
-8 -> 2010-05-01 00:00:00
-7 -> 2010-06-01 00:00:00
-6 -> 2010-07-01 00:00:00
-5 -> 2010-08-01 00:00:00
-4 -> 2010-09-01 00:00:00
-3 -> 2010-10-01 00:00:00
-2 -> 2010-11-01 00:00:00
-1 -> 2010-12-01 00:00:00
0 -> 2011-01-01 00:00:00
1 -> 2011-02-01 00:00:00
2 -> 2011-03-01 00:00:00
3 -> 2011-04-01 00:00:00
4 -> 2011-05-01 00:00:00
5 -> 2011-06-01 00:00:00
6 -> 2011-07-01 00:00:00
7 -> 2011-08-01 00:00:00
8 -> 2011-09-01 00:00:00
9 -> 2011-10-01 00:00:00
10 -> 2011-11-01 00:00:00
11 -> 2012-12-01 00:00:00
12 -> 2012-01-01 00:00:00
13 -> 2012-02-01 00:00:00
14 -> 2012-03-01 00:00:00
15 -> 2012-04-01 00:00:00
16 -> 2012-05-01 00:00:00
17 -> 2012-06-01 00:00:00
18 -> 2012-07-01 00:00:00
19 -> 2012-08-01 00:00:00
20 -> 2012-09-01 00:00:00

0

เมื่อไม่นานมานี้ฉันได้พบกับอัลกอริทึมต่อไปนี้ซึ่งทำงานได้ดีมากสำหรับการเพิ่มและลดเดือนใน a dateหรือdatetime.

CAVEAT : การดำเนินการนี้จะล้มเหลวหากdayไม่มีในเดือนใหม่ ฉันใช้สิ่งนี้กับวัตถุวันที่ที่day == 1เสมอ

Python 3.x:

def increment_month(d, add=1):
    return date(d.year+(d.month+add-1)//12, (d.month+add-1) % 12+1, 1)

สำหรับ Python 2.7 ให้เปลี่ยนเป็น//12เพียง/12เพราะการแบ่งจำนวนเต็มเป็นนัย

ฉันเพิ่งใช้สิ่งนี้ในไฟล์ดีฟอลต์เมื่อสคริปต์เริ่มรับ globals ที่มีประโยชน์เหล่านี้:

MONTH_THIS = datetime.date.today()
MONTH_THIS = datetime.date(MONTH_THIS.year, MONTH_THIS.month, 1)

MONTH_1AGO = datetime.date(MONTH_THIS.year+(MONTH_THIS.month-2)//12,
                           (MONTH_THIS.month-2) % 12+1, 1)

MONTH_2AGO = datetime.date(MONTH_THIS.year+(MONTH_THIS.month-3)//12,
                           (MONTH_THIS.month-3) % 12+1, 1)

-2
import datetime
date_str = '08/01/2018'
format_str = '%d/%m/%Y'
datetime_obj = datetime.datetime.strptime(date_str, format_str)   
datetime_obj.replace(month=datetime_obj.month-1)

วิธีแก้ปัญหาง่ายๆไม่จำเป็นต้องมีไลบรารีพิเศษ


2
จะไม่ทำงานเมื่อวันดังกล่าวเป็นวันที่ 31 มีนาคม
firecast

1
หรืออย่างวันที่ 1 มกราคม
LeandroHumb

-3

คุณสามารถทำได้สองบรรทัดดังนี้:

now = datetime.now()
last_month = datetime(now.year, now.month - 1, now.day)

จำการนำเข้า

from datetime import datetime

1
ถ้าเป็นแจนล่ะ?
Sergei
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.