Python:基于另一个数据帧中的开始和结束日期在数据帧中创建新列

Python:基于另一个数据帧中的开始和结束日期在数据帧中创建新列,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据框,表示特定季度的开始和结束日期: 下面的My函数获取一个现有数据集(未显示),并创建一个名为“Quarter”的新列。如果我现有数据集中的日期在上述数据框中的开始和结束日期范围内,则新的“季度”列将获得一个标签(即Q1或Q2)。否则我希望它是空白的 # dynamic function for quarterly cuts def quarters(df, df_quarters): for i, m in df.iterrows():

我有以下数据框,表示特定季度的开始和结束日期:

下面的My函数获取一个现有数据集(未显示),并创建一个名为“Quarter”的新列。如果我现有数据集中的日期在上述数据框中的开始和结束日期范围内,则新的“季度”列将获得一个标签(即Q1或Q2)。否则我希望它是空白的

# dynamic function for quarterly cuts

    def quarters(df, df_quarters):
        for i, m in df.iterrows():
            for j, (Quarter, Start_Date, End_Date) in df_quarters.iterrows():
                if (m['date'] >= Start_Date) & (m['date'] <= End_Date):
                    df.set_value(i, 'Quarter', Quarter)
                    break 

    quarters(WSI_Hourly, df_quarters)
#季度削减的动态功能
def宿舍(df,df_宿舍):
因为我在df.iterrows()中:
对于df_quarters中的j(季度、开始日期、结束日期)。iterrows():
如果(m['date']>=开始日期)和(m['date']尝试
作为pd进口熊猫
将numpy作为np导入

df1 = pd.DataFrame({'StartDate': pd.date_range('2016-01-01', periods=9, freq='5D'), 'EndDate': pd.date_range('2016-01-04', periods=9, freq='5D'), 'Quarter': np.arange(1, 10, 1)})

df2 = pd.DataFrame(dict(values=np.random.randn(10), date_time=pd.date_range('2016-01-01', periods=10, freq='D')))

df2['Quarter'] = np.piecewise(np.zeros(len(df2)), [(df2.date_time.values >= start_date)&(df2.date_time.values <= end_date) for start_date, end_date in zip(df1.StartDate.values, df1.EndDate.values)], df1.Quarter.values)

print df1

print df2
输出

   date_time    values  Quarter
0 2016-01-01  0.074264      1.0
1 2016-01-02  0.621282      1.0
2 2016-01-03  0.398398      1.0
3 2016-01-04 -3.435242      1.0
4 2016-01-05 -1.613446      0.0
5 2016-01-06  1.256619      2.0
6 2016-01-07  0.835417      2.0
7 2016-01-08 -0.532238      2.0
8 2016-01-09  0.047838      2.0
9 2016-01-10  0.598660      0.0
   date_time    values  Quarter
0 2016-01-01  0.074264      1.0
1 2016-01-02  0.621282      1.0
2 2016-01-03  0.398398      1.0
3 2016-01-04 -3.435242      1.0
4 2016-01-05 -1.613446      0.0
5 2016-01-06  1.256619      2.0
6 2016-01-07  0.835417      2.0
7 2016-01-08 -0.532238      2.0
8 2016-01-09  0.047838      2.0
9 2016-01-10  0.598660      0.0