前一个月的Python日期

我试图用python获取上个月的日期。 这是我已经尝试过的:

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

然而,这种方式有两个原因:首先,它将返回2012年2月的20122(而不是201202);其次,它将返回0而不是1月的12。

我一下子就解决了这个麻烦

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)

我还没有测试这段代码,我不想使用它(除非我找不到任何其他方法:/)

谢谢你的帮助!

290575 次浏览
你应该使用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

datetime和datetime。Timedelta类是您的朋友。

  1. 今天发现。
  2. 用这个找到这个月的第一天。
  3. 使用timedelta将某一天备份到上个月的最后一天。
  4. 打印您正在寻找的YYYYMM字符串。

是这样的:

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

201202被打印出来。

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

只是为了好玩,一个使用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

基于@ j.f.的评论。Sebastian,你可以将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
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))

这很简单。这样做

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 < / p >
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

对于那些来到这里,并希望获得前一个月的第一天和最后一天的人:

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

非常完整的库中,我们有subtract方法(而不是"subStract"):

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

我们看到它处理跳跃的年份。

相反的等效函数是add

< a href = " https://pendulum.eustace。io / docs / #加法和减法noreferrer“rel = > https://pendulum.eustace.io/docs/加法和减法< / >

有一个高级库dateparser,它可以确定给定自然语言的过去日期,并返回相应的Python datetime对象

from dateparser import parse
parse('4 months ago')

简单,一行代码:

import datetime as dt
previous_month = (dt.date.today().replace(day=1) - dt.timedelta(days=1)).month
import pandas as pd


lastmonth = int(pd.to_datetime("today").strftime("%Y%m"))-1


print(lastmonth)

202101

from datetime import date, timedelta
YYYYMM = (date.today().replace(day=1)-timedelta(days=1)).strftime("%Y%m")

你可能来这里是因为你正在使用NiFi中的Jython。这就是我最终实现它的方式。我稍微偏离了这是罗宾·卡洛·卡塔库坦的回答,因为访问last_day_of_prev_month。由于Jython数据类型问题解释在这里,由于某种原因,似乎存在于NiFi的Jython中,但不存在于vanilla Jython中。

from datetime import date, timedelta
import calendar
    

flowFile = session.get()
    

if flowFile != None:


first_weekday_in_prev_month, num_days_in_prev_month = calendar.monthrange(date.today().year,date.today().month-1)


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

last_day_of_prev_month = str(last_day_of_prev_month)
first_day_of_prev_month = str(first_day_of_prev_month)
    

flowFile = session.putAllAttributes(flowFile, {
"last_day_of_prev_month": last_day_of_prev_month,
"first_day_of_prev_month": first_day_of_prev_month
})
    

session.transfer(flowFile, REL_SUCCESS)

你可以这样做:

from datetime import datetime, timedelta
last_month = (datetime.now() - timedelta(days=32)).strftime("%Y%m")

明确的方式:

import datetime
result = (datetime.datetime.today().month - 2) % 12 + 1

问题是如何转移month[1,2,3,…], 12]到[12,1,2,…]11)。

Step1: month = month - 1 transfer[1,2,3,…], 12] to[0,1,2,…]11)。

Step2: month = (month - 1) % 12 transfer[0,1,2,…], 11] to[11, 0,1,…], 10]。

Step3: month = month + 1 transfer[11, 0,1,…], 10]到[12,1,2,…]11)。

因此,结果是result = (month - 2) % 12 + 1

from datetime import datetime, timedelta, time, timezone


current_time = datetime.now(timezone.utc)
last_day_previous_month = datetime.combine(current_time.replace(day=1), time.max) - timedelta(days=1)
first_day_previous_month = datetime.combine(last_day_previous_month, time.min).replace(day=1)

输出:

first_day_previous_month: 2022-02-01 00:00:00
last_day_previous_month: 2022-02-28 23:59:59.999999