上个月的python日期

时间:2012-03-15 17:22:00

标签: python date time

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

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

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

我用b /

解决了这个问题
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)

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

感谢您的帮助!

16 个答案:

答案 0 :(得分:218)

datetime和datetime.timedelta课程是你的朋友。

  1. 今天找到。
  2. 用它来查找本月的第一天。
  3. 使用timedelta备份一天,到上个月的最后一天。
  4. 打印您正在寻找的YYYYMM字符串。
  5. 像这样:

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

答案 1 :(得分:53)

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

答案 2 :(得分:41)

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

答案 3 :(得分:6)

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

答案 4 :(得分: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))

答案 5 :(得分:3)

非常简单易行。这样做

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

答案 6 :(得分:3)

有了Pendulum非常完整的库,我们有了subtract方法(而不是“ subStract”):

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

答案 7 :(得分: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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

简单的单衬:

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

答案 11 :(得分:1)

import pandas as pd

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

print(lastmonth)
<块引用>

202101

答案 12 :(得分:1)

您来到这里可能是因为您正在使用 NiFi 中的 Jython。这就是我最终实施它的方式。我稍微偏离了 this answer by Robin Carlo Catacutan,因为由于 Jython 数据类型问题,无法访问 last_day_of_prev_month.day 解释 here 出于某种原因似乎存在于 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)

答案 13 :(得分:0)

建立@ J.F的评论。塞巴斯蒂安,你可以将replace()函数链接到一个&#34;月&#34;。由于一个月不是一个固定的时间段,因此该解决方案会尝试返回上个月的同一天,这当然不适用于所有月份。在这种情况下,此算法默认为上个月的最后一天。

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

答案 14 :(得分:0)

如果要在LINUX / UNIX环境中查看EXE类型文件中的ASCII字母,请尝试“ od -c'filename'| more”

您可能会得到很多无法识别的项目,但它们都会全部显示,并且将显示HEX表示形式,并且ASCII等效字符(如果适用)将跟随十六进制代码行。在您知道的已编译代码上尝试一下。您可能会在其中识别出一些东西。

答案 15 :(得分:-2)

这对我有用:

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