时间序列获取每月的最后一个必需的日期并重复

时间:2018-06-27 10:16:23

标签: python pandas time-series

  
      
  1. 一个数据框具有“ START”,“ CLOSE”列,每个列   代表一个日期。
  2.   
  3. 添加了另一列“ WOM”(每月的第几周),以了解给定开始日期属于哪个月的哪一周(介于1到5之间)。
  4.   
  5. 添加了另外一个具有条件的列“ END”,如果“ WOM”小于4,则使用与CLOSE相同的最后一个月,否则使用下一个   最后一个月以END结尾。
  6.   

以下代码执行了上述操作,但没有产生正确的END列:

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,怎么了?我该怎么解决?

enter image description here

1 个答案:

答案 0 :(得分:0)

  

我已经解决了以下问题:

     
      
  1. 已删除WOM列
  2.   
  3. 使用“关闭”列而不是“开始”列查找结尾
  4.   

这是代码:

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 )

我感谢任何其他解决方案!