Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取[周/月/季度/年]最后一天的日期_Python_Python 3.x_Pandas - Fatal编程技术网

Python 获取[周/月/季度/年]最后一天的日期

Python 获取[周/月/季度/年]最后一天的日期,python,python-3.x,pandas,Python,Python 3.x,Pandas,有没有办法用datetime,pandates或其他日期和时间utils获取[周/月/季/年]最后一天的日期(日期时间datetime,pd.Timestamp或等效日期?您可以在日期时间索引中添加pandates.DateOffset,Timestamp或datetime.date或datetime.datetime: dates = pd.date_range('2015-8-13', periods=4, freq='3D') # DatetimeIndex(['2015-08-13',

有没有办法用
datetime
pandates
或其他日期和时间utils获取[周/月/季/年]最后一天的日期(日期时间
datetime
pd.Timestamp
或等效日期?

您可以在
日期时间索引中添加
pandates.DateOffset
Timestamp
datetime.date
datetime.datetime

dates = pd.date_range('2015-8-13', periods=4, freq='3D')
# DatetimeIndex(['2015-08-13', '2015-08-16', '2015-08-19', '2015-08-22'],
# dtype='datetime64[ns]', freq='3D', tz=None)
捕捉到一周的最后一天(例如,星期日):

捕捉到当月的最后一天:

In [207]: dates+offsets.MonthEnd()
Out[207]: DatetimeIndex(['2015-08-31', '2015-08-31', '2015-08-31', '2015-08-31'], dtype='datetime64[ns]', freq=None, tz=None)
捕捉到季度的最后一天:

In [212]: dates+offsets.QuarterEnd()
Out[215]: DatetimeIndex(['2015-09-30', '2015-09-30', '2015-09-30', '2015-09-30'], dtype='datetime64[ns]', freq=None, tz=None)
捕捉到一年中的最后一天:

In [219]: dates+offsets.YearEnd()
Out[222]: DatetimeIndex(['2015-12-31', '2015-12-31', '2015-12-31', '2015-12-31'], dtype='datetime64[ns]', freq=None, tz=None)
请注意,添加偏移始终会提前日期。例如,2015-08-16是一个星期日,添加一个
offset.Week(weekday=6)
将其提前到2015-08-23:

In [233]: pd.Timestamp('2015-8-16')+offsets.Week(weekday=6)
Out[233]: Timestamp('2015-08-23 00:00:00')
为了防止这种情况发生,您可以从
日期中减去一天:

In [234]: dates - offsets.Day() + offsets.Week(weekday=6)
Out[237]: DatetimeIndex(['2015-08-16', '2015-08-16', '2015-08-23', '2015-08-23'], dtype='datetime64[ns]', freq=None, tz=None)

仅使用
datetime

>>> d = datetime.date.today()
每周最后一天:

# This was wrong earlier.
>>> d + datetime.timedelta(days=5 - d.weekday())
datetime.date(2015, 8, 15)
每月最后一天:

>>> datetime.date(year=(d.year + int(d.month % 12 == 0)), month=(d.month + 1) % 12, day=1) - datetime.timedelta(days=1)
datetime.date(2015, 8, 31)
季度最后一天:

>>> datetime.date(year=d.year, month=((d.month % 3) + 1) * 3 + 1, day=1) - datetime.timedelta(days=1)
datetime.date(2015, 9, 30)
一年的最后一天:

>>> datetime.date(year=d.year, month=12, day=31)
datetime.date(2015, 12, 31)

编辑:这一切都很丑陋,使用更高级别的第三方库可能是最好的,除非有令人信服的理由不这样做(这里似乎没有)。

是的。获取今天的
datetime
对象,并将相关字段设置为maximum@unutbu,使用
snap()
方法仍然可以进行一些基本检查:如果捕捉到的日期在给定日期之前,则将给定日期向前移动给定的间隔,然后再次捕捉,然后返回一天。@TigerhawkT3:是的,这可以工作,但我认为使用searchsorted可能更容易。链接的文档上写着“最近的”。它只是向前快照吗?@TigerhawkT3:谢谢你的更正。更新后的答案是“快速前进”。很好!也许您希望使用
from datetime import date,timedelta
缩短代码并稍微提高可读性,然后删除
datetime
命名空间。小错误:
weekday
0..6
范围内。因此,在第一个示例中,您可能会在昨天返回。谢谢。固定的。真倒霉,它今天起作用了。虽然周末是模棱两可的。我假设美国的会议是星期六。我猜
一年中的最后一天(N)=一个月中的最后一天(N,12)
,但你永远不知道,也许有些日子年会有13个月…
>>> datetime.date(year=d.year, month=12, day=31)
datetime.date(2015, 12, 31)
import datetime
from dateutil.relativedelta import relativedelta, SU

def last_day_of_week(year, week_num):
    # assuming sunday is the last day of week
    # weeks= is an offset, hence the minus one
    return datetime.date(year, 1, 1) + relativedelta(weekday=SU(1), weeks=week_num - 1)

def last_day_of_month(year, month):
    return datetime.date(year, month, 1) + relativedelta(months=1, days=-1)

def last_day_of_year(year):
    return datetime.date(year, 1, 1) + relativedelta(years=1, days=-1)