【问题标题】:Subtract a month from a date in Python? [duplicate]从 Python 中的日期减去一个月? [复制]
【发布时间】:2016-07-05 10:04:14
【问题描述】:

我需要从任何日期获取上个月的第一天。 我知道我可以使用monthdelta(datetime(2010,3,30), -1) 获取上个月,但它不会返回第一天。

【问题讨论】:

  • 为什么不datetime(2010, 3 - 1, 1)
  • 因为我有很多日期 2016-05-13 19:05:38, 2016-06-18 19:05:46, 2016-06-12 19:06:46, 2016-03-13 19:07:04, 2016-02-13 19:09:59, 2016-09-13 19:11:11 并且所有日期我都想得到上个月的第一天

标签: python datetime


【解决方案1】:

这可以通过首先计算当前月份(或任何给定日期)的第一天,然后用 datetime.timedelta(days=1) 减去它得到上个月的最后一天来完成。

为了演示,这里是一个示例代码:

import datetime

def get_lastday(current):
    _first_day = current.replace(day=1)
    prev_month_lastday = _first_day - datetime.timedelta(days=1)
    return prev_month_lastday.replace(day=1)

【讨论】:

  • 投了反对票,因为当前答案为您提供了上个月的最后天,而不是第一
  • @donkopotamus 感谢您指出,我做错了。我编辑了帖子。
【解决方案2】:

试试这样。使用datetimedatetutil

(如果您无法使用datetutil,请安装pip install python-dateutil

In [1]: from datetime import datetime
In [2]: import dateutil.relativedelta
In [3]: today_date = datetime.now().date()
In [4]: today_date
Out[1]: datetime.date(2016, 7, 5)
In [5]: last_month = today_date - dateutil.relativedelta.relativedelta(months=1)
In [6]: last_mont_first_date = last_month.replace(day=1)
In [7]: last_mont_first_date
Out[2]: datetime.date(2016, 6, 1)

输入:

datetime.date(2016, 7, 5)

输出

datetime.date(2016, 6, 1)

【讨论】:

  • 我尝试df['used_at'] > (dates[i] - dateutil.relativedelta.relativedelta(months=1))).replace(day=1),但它返回TypeError: replace() got an unexpected keyword argument 'day'
  • 在此之前我尝试df['used_at'] > dates[i].replace(month=date.month - 1, day=1),但它只返回一天
  • 我认为你正在尝试不同的东西。
  • df['used_at'] > (dates[i] - dateutil.relativedelta.relativedelta(months=1)).replace(day=1) 试试这个对我有用。
  • 我之前写过,它返回TypeError: replace() got an unexpected keyword argument 'day'
【解决方案3】:

试试这个:

from datetime import date
d = date.today()
d.replace(
    year=d.year if d.month > 1 else d.year - 1,
    month=d.month - 1 if d.month > 1 else 12,
    day=1
)

【讨论】:

  • 如果当前月份是 1 月,这是否有效?
  • 我尝试df['used_at'] > dates[i].replace(month=date.month - 1, day=1),但只用了 1 天
  • 那么年份呢?
  • 是的,好点 ;)
  • 请注意,年份问题已修复。 3 年后,我不确定自己是否做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多