上个月的pythondate

我想用python来获取上个月的date。 这是我试过的:

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

但是,这样做有两个原因:首先2012年2月(而不是201202)返回20122,其次是1月份返回0而不是12。

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

我没有testing这个代码,我不想用它(除非我找不到任何其他方式:/)

谢谢你的帮助!

datetime和datetime.timedelta类是你的朋友。

  1. 今天find
  2. 用它来find本月的第一天。
  3. 使用timedelta备份一天,到上个月的最后一天。
  4. 打印您正在寻找的YYYYMMstring。

喜欢这个:

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

你应该使用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 
 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 

build立在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')) 
 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

 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 

只是为了好玩,一个纯粹的math答案使用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 

build立@JF塞巴斯蒂安的评论,你可以链接replace()函数回去一个“月”。 由于一个月不是一个固定的时间段,所以这个解决scheme试图回到上个月的同一天,这当然不适用于所有的月份。 在这种情况下,该algorithm默认为上个月的最后一天。

 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 

这对我工作:

 import datetime today = datetime.date.today() last_month = today.replace(month=today.month-1, day=1)