पिछले महीने की अजगर की तारीख


132

मैं अजगर के साथ पिछले महीने की तारीख पाने की कोशिश कर रहा हूं। यहाँ मैं क्या करने की कोशिश की है:

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

हालांकि, यह तरीका 2 कारणों से खराब है: पहला यह 2012 के फरवरी (201202 के बजाय) के लिए 20122 में लौटता है और दूसरा यह जनवरी में 12 के बजाय 0 वापस आएगा।

मैंने इस मुसीबत को हल कर दिया है

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

मुझे लगता है कि अगर इस उद्देश्य के लिए बैश में एक अंतर्निहित तरीका है, तो अजगर, बहुत अधिक सुसज्जित है, इस लक्ष्य को प्राप्त करने के लिए अपनी स्क्रिप्ट लिखने के लिए मजबूर करने से बेहतर कुछ प्रदान करना चाहिए। बेशक मैं ऐसा कुछ कर सकता था:

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)

मैंने इस कोड का परीक्षण नहीं किया है और मैं इसका वैसे भी उपयोग नहीं करना चाहता (जब तक कि मुझे कोई अन्य तरीका नहीं मिल सकता: /)

आपकी सहायताके लिए धन्यवाद!


जवाबों:


300

डेटाटाइम और डेटाटाइम । टाइमलाइलटा क्लासेस आपके मित्र हैं।

  1. आज खोजो।
  2. इस महीने का पहला दिन खोजने के लिए इसका उपयोग करें।
  3. पिछले महीने के अंतिम दिन, एक दिन के बैकअप के लिए टाइमडेल्टा का उपयोग करें।
  4. उस YYYYMM स्ट्रिंग को प्रिंट करें जिसे आप खोज रहे हैं।

ऐशे ही:

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

201202 छपा है।


31
आप .replace()विधि का उपयोग कर सकते हैं :datetime.utcnow().replace(day=1) - timedelta(days=1)
jfs

1
ठंडा! मैंने प्रतिस्थापित विधि को याद किया।
bgporter

आप .replace()फ़ंक्शन को चेन भी कर सकते हैं । आखिरी महीने को पाने के लिए एक बार करें, फिर उस दिन को पाने के लिए फिर से करें। पहला: d = date.today() तबone_month_ago = (d.replace(day=1) - timedelta(days=1)).replace(day=d.day)
ठाणे प्लमर

@JFSebastian आप सही हैं - इस ओर इशारा करने के लिए धन्यवाद। ऐसा प्रतीत नहीं होता है कि इसके लिए एक सुरुचिपूर्ण एक-लाइनर एक "महीने" के रूप में एक निरंतर समय अवधि नहीं है। आप आयात calendarऔर उपयोग करके कुछ बदसूरत कर सकते हैं calendar.mdays[d.month-1]और min()2 में एक फ़ंक्शन में अधिक कुरूपता कर सकते हैं replace, लेकिन यह संयुक्त राष्ट्र के पायथोनिक लगता है और कोने के मामलों के लिए जिम्मेदार नहीं है। मैंने try - exceptसभी मामलों के लिए कौन से खातों का उपयोग करते हुए अपना जवाब नीचे दिया है , हालाँकि मैं एक एल्गोरिथ्म के हिस्से के रूप में अपवादों का उपयोग करने से नफरत करता हूं।
ठाणे प्लमर

इवान का उत्तर देखें, और जोड़ें: min (date.today () दिन, last_day_of_prepret_month.day)
michel.iamit

70

आपको खजूर का उपयोग करना चाहिए । इसके साथ, आप relativedelta का उपयोग कर सकते हैं, यह 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

यह वर्ष के पहले महीने के लिए काम नहीं कर रहा है: >>> गैर कानूनी महीने: खराब महीना नंबर -1; 1-12
mtoloo

@mtoloo खजूर का क्या संस्करण? मुझे वह मुद्दा नहीं आ रहा है, लेकिन मैं कुछ वैकल्पिक वाक्यविन्यास जोड़ूंगा
डेव बटलर

1
मैं इसे पसंद करता हूं क्योंकि @bgporter के पास एक बहुत अच्छा समाधान है, लेकिन अगले महीने की तलाश में उसका अच्छा काम नहीं करता है।
डैनियल एफ

3
@mtoloo शायद आपने महीने / महीने गलत किया है
r_black

2
@r_black हां आप सही हैं। यही मेरी गलती थी। यहां दिया गया समाधान सही है और वर्ष के पहले महीने के लिए आगे की जांच की आवश्यकता नहीं है।
मटोलू

45
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

या:

from datetime import date, timedelta

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

समाधान का हिस्सा ... पिछले महीने के दिन को खोजने के लिए, इस तरह से कुछ जोड़ें: दिन_प्रकाश_मंथन = मिनट (आज, दिन, last_day_of_prepret_month.day) दिनों की संख्या से अधिक होने से बचने के लिए।
michel.iamit

9

Bgporter के जवाब पर बिल्डिंग ।

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

यह बहुत आसान और सरल है। यह करो

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()

यहाँ आउटपुट है: $ 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

4

किसी ऐसे व्यक्ति के लिए जो पिछले महीने के पहले और आखिरी दिन दोनों को प्राप्त करना चाहता है:

from datetime import date, timedelta

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

start_day_of_prev_month = date.today().replace(day=1) - timedelta(days=last_day_of_prev_month.day)

# For printing results
print("First day of prev month:", start_day_of_prev_month)
print("Last day of prev month:", last_day_of_prev_month)

आउटपुट:

First day of prev month: 2019-02-01
Last day of prev month: 2019-02-28

यदि आप एक महीने (और अधिक) की शुरुआत और अंत प्राप्त करना चाहते हैं, तो Calendarमॉड्यूल पर एक नज़र डालें : stackabuse.com/introduction-to-the-python-calendar-module
टोस्ट 38coza

अगर हम दूसरा पिछला महीना शुरू और अंत चाहते हैं?
गेमर

3
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))

31 मार्च को ब्रेक
माइक

1

सिर्फ मनोरंजन के लिए, डिमोड का उपयोग करके एक शुद्ध गणित उत्तर। गुणन की वजह से बहुत ही अपर्याप्त, महीने की संख्या पर एक साधारण जांच कर सकता है (यदि 12 के बराबर, वर्ष बढ़ाएं, आदि)

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

साथ पेंडुलम बहुत पूरा पुस्तकालय, हमारे पास subtractविधि ( "घटाना" और नहीं):

import pendulum
today = pendulum.datetime.today()  # 2020, january
lastmonth = today.subtract(months=1)
lastmonth.strftime('%Y%m')
# '201912'

हम देखते हैं कि यह कूदने वाले वर्षों को संभालता है।

रिवर्स समकक्ष है add

https://pendulum.eustace.io/docs/#addition-and-subtraction


0

@ जेएफ सेबस्टियन की टिप्पणी का निर्माण, आप replace()एक "महीने" वापस जाने के लिए फ़ंक्शन को चेन कर सकते हैं। चूंकि एक महीने लगातार समय अवधि नहीं है, इसलिए यह समाधान पिछले महीने की उसी तारीख में वापस जाने की कोशिश करता है, जो निश्चित रूप से सभी महीनों तक काम नहीं करता है। ऐसे मामले में, यह एल्गोरिथ्म पूर्व महीने के अंतिम दिन तक चूक जाता है।

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))

आउटपुट:

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

0

यदि आप एक LINUX / UNIX पर्यावरण में एक EXE प्रकार फ़ाइल में ASCII अक्षरों को देखना चाहते हैं, तो "od -c 'फ़ाइल नाम का प्रयास करें। अधिक |

आपको संभवतः बहुत सारे अपरिचित आइटम मिलेंगे, लेकिन वे सभी प्रस्तुत किए जाएंगे, और हेक्स प्रतिनिधित्व प्रदर्शित किए जाएंगे, और एएससीआईआई समतुल्य वर्ण (यदि उपयुक्त हो) हेक्स कोड की लाइन का पालन करेंगे। कोड के एक संकलित टुकड़े पर इसे आज़माएं जो आप जानते हैं। हो सकता है कि आप इसमें उन चीजों को देखें जिन्हें आप पहचानते हैं।


क्या आप यह समझाने के लिए इसे संपादित कर सकते हैं कि यह प्रश्न का उत्तर कैसे देता है।
एड्रियनएचएच

0

एक उच्च स्तरीय पुस्तकालय है dateparserजो प्राकृतिक भाषा को देखते हुए पिछली तिथि निर्धारित कर सकता है, और संबंधित पायथन datetimeऑब्जेक्ट को वापस कर सकता है

from dateparser import parse
parse('4 months ago')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.