如何获取每个月的第二个星期五的日期范围?

Posted

技术标签:

【中文标题】如何获取每个月的第二个星期五的日期范围?【英文标题】:How to get a daterange of the 2nd Fridays of each month? 【发布时间】:2016-08-09 01:00:55 【问题描述】:

我需要用 Python 获取每个月的第二个星期五。

我已经编写了下面的函数来演示我需要什么。但是,我想知道是否有更优雅的方式来使用 Pandas 的 date_range 函数和适当的偏移量。

def second_friday_of_month_date_range( start, end ):
    dr = pd.date_range( start, end, freq='MS' )

    first_weekday_of_month_to_2nd_friday_of_month = np.array( [ 12, 11, 10, 9, 8, 14, 13 ], dtype=int )
    wd                                            = first_weekday_of_month_to_2nd_friday_of_month[ dr.weekday ]
    offsets                                       = [ datetime.timedelta( days=int(x)-1 ) for x in wd ]
    dts                                           = [d+o for d, o in zip( dr, offsets)]
    return pd.DatetimeIndex( dts )

import pandas as pd
import datetime
d0 = datetime.datetime(2016,1,1)
d1 = datetime.datetime(2017,1,1)
dr = second_friday_of_month_date_range( d0, d1 )
print( dr )

>> DatetimeIndex(['2016-01-08', '2016-02-12', '2016-03-11', '2016-04-08',
               '2016-05-13', '2016-06-10', '2016-07-08', '2016-08-12',
               '2016-09-09', '2016-10-14', '2016-11-11', '2016-12-09',
               '2017-01-13'],
              dtype='datetime64[ns]', freq=None, tz=None)

【问题讨论】:

【参考方案1】:

尝试this 方法:

import dateutil as du
import pandas as pd

start=du.parser.parse('2016-01-01')

rr = du.rrule.rrule(du.rrule.MONTHLY,
                    byweekday=du.relativedelta.FR(2),
                    dtstart=start,
                    count=12)

dates = [pd.to_datetime(d) for d in rr]

输出:

In [33]: dates
Out[33]:
[Timestamp('2016-01-08 00:00:00'),
 Timestamp('2016-02-12 00:00:00'),
 Timestamp('2016-03-11 00:00:00'),
 Timestamp('2016-04-08 00:00:00'),
 Timestamp('2016-05-13 00:00:00'),
 Timestamp('2016-06-10 00:00:00'),
 Timestamp('2016-07-08 00:00:00'),
 Timestamp('2016-08-12 00:00:00'),
 Timestamp('2016-09-09 00:00:00'),
 Timestamp('2016-10-14 00:00:00'),
 Timestamp('2016-11-11 00:00:00'),
 Timestamp('2016-12-09 00:00:00')]

【讨论】:

【参考方案2】:

您可以通过在pd.date_range 中设置freq='WOM-2FRI'(“每月的第二个星期五”)轻松地做到这一点。因此,要获得预期的输出,您可以编写:

pd.date_range('2016-01-01', freq='WOM-2FRI', periods=13)

输出是:

DatetimeIndex(['2016-01-08', '2016-02-12', '2016-03-11', '2016-04-08',
               '2016-05-13', '2016-06-10', '2016-07-08', '2016-08-12',
               '2016-09-09', '2016-10-14', '2016-11-11', '2016-12-09',
               '2017-01-13'],
              dtype='datetime64[ns]', freq='WOM-2FRI')

【讨论】:

你能分享一个链接到记录它的 secret 地方吗?目前我必须解析 pandas 源文件才能找到有关frequency 规则的一些信息 @MaxU:我认为DateOffset objects 是记录此类功能的主要位置,尽管该页面并未直接涵盖诸如freq='WOM-3TUE' 之类的设置参数。我通过玩pd.offsets.WeekOfMonth推断出字符串模式。 谢谢!遗憾的是,这么丰富的 pandas 功能记录得这么差:( 我还在这里发现了一些有趣的东西:pandas/tseries/tests/test_frequencies.py

以上是关于如何获取每个月的第二个星期五的日期范围?的主要内容,如果未能解决你的问题,请参考以下文章

获取日历月的第一个星期一

如何在每个月的列中获取最大星期六日期,而无需硬编码

如何找到一个月中的特定日期?

从给定日期获取每月的星期数

MySQL中如何获得指定日期中月份的第一天是周几?

如何在php中获取上周的日期(星期二或其他日期)?