web-dev-qa-db-ja.com

python前月の日付

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

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

ただし、この方法には2つの理由があります。1つ目は201202年ではなく2012年2月に20122を返し、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)

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

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

101
philippe

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
 >>>
238
bgporter

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
55
Dave Butler
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
43
Ivan

bgporter's answer で構築します。

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'))
6
paragbaxi
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
steve

その非常に簡単でシンプル。これを行う

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

ここに来て、前月の最初と最後の両方の日を取得しようとしている人の場合:

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

楽しみのために、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
1
Tiberiu Ichim

@ J.F。のコメントの構築セバスチャン、replace()関数をチェーンして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
Thane Plummer

LINUX/UNIX環境でEXEタイプのファイルのASCII文字を確認するには、「od -c 'filename' | more」を試してください。

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

0
Rick