2017-01-10 2 views
0

Ich habe folgenden Datenrahmen bezeichnet Start- und Enddatum für ein bestimmtes Quartal:Python: Erstellen neue Spalt in Datenrahmen basierend auf Start- und Enddatum in einem anderen Datenrahmen

enter image description here

Meine Funktion nehmen unter einem vorhandenen Datensatz (nicht gezeigt) und erstellt eine neue Spalte namens "Quarter". Wenn das Datum in meinem vorhandenen Datensatz innerhalb des Anfangs- und Enddatums in dem obigen Datenrahmen liegt, erhält die neue Spalte "Quartal" eine Bezeichnung (d. H. Q1 oder Q2). Ansonsten möchte ich, dass es leer ist.

# 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) 

Die Funktion, die ich über Werke geschrieben, aber mit einem Haken. Es kennzeichnet noch jedes Datum vor 2016, 1, 1 in meinem Datensatz als Q1. Wenn ich beispielsweise ein Datum wie 2015, 12, 3 habe, sollte die Spalte "Quartal" leer sein, da sie außerhalb des zulässigen Bereichs liegt. Aber es bezeichnet es immer noch als Q1.

* Jede Hilfe wird sehr geschätzt.

Antwort

0

versuchen import pandas als pd import numpy als 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 

Eingangsdaten

 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 

Ausgang

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 
Verwandte Themen