[英]Python: Creating New Column in Dataframe based on Start and End Dates in Another Dataframe
我有以下数据框,表示特定季度的开始和结束日期:
我下面的函数采用一个现有的数据集(未显示),并创建一个名为“ 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)
我上面编写的功能可以正常使用,但是很麻烦。 它仍将数据集中2016年之前的任何日期1、1标记为Q1。 例如,如果我有一个日期,例如2015、12、3,则“四分之一”列应为空白,因为它超出了范围。 但它仍将其标记为Q1。
*任何帮助是极大的赞赏。
尝试将pandas作为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
输入数据
EndDate Quarter StartDate
0 2016-01-04 1 2016-01-01
1 2016-01-09 2 2016-01-06
2 2016-01-14 3 2016-01-11
3 2016-01-19 4 2016-01-16
4 2016-01-24 5 2016-01-21
5 2016-01-29 6 2016-01-26
6 2016-02-03 7 2016-01-31
7 2016-02-08 8 2016-02-05
8 2016-02-13 9 2016-02-10
产量
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.