前月のpython日付


131

私はPythonで前月の日付を取得しようとしています。これが私が試したものです:

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

ただし、この方法は2つの理由で不適切です。1つ目は、2012年2月の20122(201202ではなく)を返し、2つ目は、1月の12ではなく0を返します。

私はbashでこの問題を解決しました

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

bashにこの目的のための組み込みの方法がある場合、Pythonは、はるかに多くの機能を備えており、この目標を達成するために独自のスクリプトを作成することを強制するよりも優れた機能を提供するはずです。もちろん、私は次のようなことをすることができます:

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)

私はこのコードをテストしていないので、とにかくそれを使用したくありません(他の方法が見つからない場合を除きます:/)。

ご協力いただきありがとうございます!


回答:


299

datetimeクラスとdatetime.timedeltaクラスは友だちです。

  1. 今日見つけなさい。
  2. これを使用して、今月の最初の日を見つけます。
  3. timedeltaを使用して、1日を前月の最終日にバックアップします。
  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
涼しい!replaceメソッドを逃しました。
bgporter 2012年

.replace()関数をチェーンすることもできます。先月取得するために1回実行してから、必要な日を取得するためにもう一度実行します。最初:d = date.today() 次にone_month_ago = (d.replace(day=1) - timedelta(days=1)).replace(day=d.day)
Thane Plummer

@JFSebastian正解です。指摘いただきありがとうございます。「月」は一定の期間ではないため、これにはエレガントなワンライナーはありません。2番目の関数calendarをインポートして使用することで醜いことをしたりcalendar.mdays[d.month-1]min()関数をもっと醜くしたりできますがreplace、Pythonのように見えず、コーナーケースを考慮していません。try - exceptアルゴリズムの一部として例外を使用することは嫌いですが、すべてのケースに当てはまるアカウントを使用して、以下の回答を更新しました。
Thane Plummer、2015

イヴァンの答えを見て、追加してください:min(date.today()。day、last_day_of_previous_month.day)
michel.iamit

70

dateutilを使用する必要があります。これにより、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

年の最初の月は機能しません:>>> IllegalMonthError:悪い月番号-1; 1〜12でなければなりません
mtoloo 2014年

@mtoloo dateutilのバージョンは何ですか?私はその問題はありませんが、いくつかの代替構文を追加します
Dave Butler

1
@bgporterには非常に優れた解決策がありますが、彼の解決策は翌月のルックアップに適していません。
ダニエルF

3
@mtolooおそらく月/月のタイプを間違えたでしょう
r_black

2
@r_blackはいそうです。それは私のせいでした。ここに与えられた解決策は正しく、その年の最初の月にそれ以上のチェックは必要ありません。
mtoloo 2016年

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

ソリューションの一部...先月の日を見つけるには、次のようなものを追加します。day_previous_month= min(today.day、last_day_of_previous_month.day)は、日数を超えないようにします。
michel.iamit 2016

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を
toast38coza

前月の2月の開始と終了が必要な場合は、
ゲーマー

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

3月31日の休憩
マイク

1

楽しみのために、divmodを使用した純粋な数学の答え。乗算のためにかなり非効率的で、月の数を単純にチェックすることもできます(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


0

@JF Sebastianのコメントを基に、replace()関数をチェーンして1か月前に戻すことができます。1か月は一定の期間ではないため、このソリューションは前の月と同じ日付に戻ろうとしますが、すべての月で機能するわけではありません。このような場合、このアルゴリズムはデフォルトで前月の最終日になります。

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 'filename' | more」を試してください。

多くの場合、認識できない項目が表示されますが、それらはすべて表示され、HEX表現が表示され、ASCII相当文字(該当する場合)が16進コードの行に続きます。知っているコンパイル済みのコードで試してください。あなたはそれであなたが認識するものを見るかもしれません。


これを編集して、質問への回答を説明してください。
AdrianHHH

0

dateparser自然言語を指定して過去の日付を決定し、対応するPython datetimeオブジェクトを返す高レベルのライブラリがあります

from dateparser import parse
parse('4 months ago')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.