Python Timeseries获取当月最后一个必需的日期并重复它 数据帧有“开始”、“关闭”列,每列 代表一个日期 添加了另一列“WOM”一周,以了解给定开始日期在本月的哪一周(介于1到5之间) 添加另一列“结束”具有条件,如果“WOM”小于4,则在上个月结束时使用与“结束”相同的月份,否则使用下一个 最后几个月结束

Python Timeseries获取当月最后一个必需的日期并重复它 数据帧有“开始”、“关闭”列,每列 代表一个日期 添加了另一列“WOM”一周,以了解给定开始日期在本月的哪一周(介于1到5之间) 添加另一列“结束”具有条件,如果“WOM”小于4,则在上个月结束时使用与“结束”相同的月份,否则使用下一个 最后几个月结束,python,pandas,time-series,Python,Pandas,Time Series,以下代码执行上述操作,但不能生成正确的结束列: import pandas as pd start = pd.date_range('2016-06-01', '2018-06-27', freq='7D') close = start.shift(1) - pd.Timedelta('1Day') df = pd.DataFrame({'START':start, 'CLOSE':close}, columns=['START', 'CLOSE']) #Week of the month d

以下代码执行上述操作,但不能生成正确的结束列:

import pandas as pd

start = pd.date_range('2016-06-01', '2018-06-27', freq='7D')
close = start.shift(1) - pd.Timedelta('1Day')
df = pd.DataFrame({'START':start, 'CLOSE':close}, columns=['START', 'CLOSE'])
#Week of the month
df['WOM'] = df.START.apply(lambda x: (x.day-1)//7+1)
#Get end list
ends = df['CLOSE']
ends.index = ends
ends = ends.resample('M').last()

def get_end(x):
    try:
        wom = x['WOM']
        st = x['START']
        me = ends.searchsorted(st)
        print(f'{st:%Y-%m-%d}_{wom}_{me[0]}')
        if wom >= 4:
            return ends.iloc[me[0] +1]
        else:
            return ends.iloc[me[0]]
    except:
        return None

df['END'] = df.apply(lambda x: get_end(x), axis=1 )
图中突出显示的列应为2016-07-26,而不是 2016-08-30,出了什么问题,我该如何解决

我已经解决了它如下:

  • 已删除WOM列
  • 使用“关闭”列而不是“开始”列查找结束
  • 代码如下:

    import pandas as pd
    start = pd.date_range('2016-06-01', '2018-06-27', freq='7D')
    close = start.shift(1) - pd.Timedelta('1Day')
    df = pd.DataFrame({'START':start, 'CLOSE':close}, columns=['START', 'CLOSE'])
    #Get end list
    ends = df['CLOSE']
    ends.index = ends
    ends = ends.resample('M').last()
    
    def get_end(x):
        try:
            wom =  (x['CLOSE'].day - 1)// 7+1
            st = x['CLOSE']
            me = ends.searchsorted(st)
            if wom >= 4:
                return ends.iloc[me[0] +1]
            else:
                return ends.iloc[me[0]]
        except:
            return None
    
    df['END'] = df.apply(lambda x: get_end(x), axis=1 )
    
    我非常感谢任何其他解决方案