- 一个数据框具有“ START”,“ CLOSE”列,每个列 代表一个日期。
- 添加了另一列“ WOM”(每月的第几周),以了解给定开始日期属于哪个月的哪一周(介于1到5之间)。
- 添加了另外一个具有条件的列“ END”,如果“ WOM”小于4,则使用与CLOSE相同的最后一个月,否则使用下一个 最后一个月以END结尾。
以下代码执行了上述操作,但没有产生正确的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,怎么了?我该怎么解决?
答案 0 :(得分:0)
我已经解决了以下问题:
- 已删除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 )
我感谢任何其他解决方案!