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

Gin*_*ger 4 python indexing datetime pandas

我需要在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)
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 5

您可以通过设置freq='WOM-2FRI'(" 一周中的一周,第二个星期五 ")轻松完成此操作pd.date_range.因此,要获得预期的输出,您可以写:

pd.date_range('2016-01-01', freq='WOM-2FRI', periods=13)
Run Code Online (Sandbox Code Playgroud)

输出是:

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')
Run Code Online (Sandbox Code Playgroud)