2016-08-31 2 views
0

In Pandas habe ich zwei Datenrahmen. Eine enthält die Feiertage eines bestimmten Landes von http://www.timeanddate.com/holidays/austria und eine andere enthält eine Datumsspalte. Ich möchte die #days nach einem Urlaub berechnen.python time lags holidays

def compute_date_diff(x, y): 
    difference = y - x 
    differenceAsNumber = (difference/ np.timedelta64(1, 'D')) 
    return differenceAsNumber.astype(int) 

for index, row in holidays.iterrows(): 
    secondDF[row['name']+ '_daysAfter'] = secondDF.dateColumn.apply(compute_date_diff, args=(row.day,)) 

jedoch diese

  • beispielsweise die falsche Differenz berechnet > als ein Jahr für den Fall holidays enthält Daten für mehr als ein Jahr.
  • ist ziemlich langsam.

Wie kann ich die Fehler und erhöht die Leistung beheben? Gibt es eine Parallele? Oder was ist mit http://pandas.pydata.org/pandas-docs/stable/timeseries.html#holidays-holiday-calendars Da ich neu bei Pandas bin, bin ich mir nicht sicher, wie man das aktuelle Datum/den Index des Datumsobjekts erhält, während ich mich in Anwendung bewerbe. Soweit ich weiß, kann ich den umgekehrten Weg nicht beschreiben. über alle meine Zeilen in secondDF, wie es war unmöglich für mich Feature Spalten zu erzeugen, während über apply Iterieren

Antwort

0

Ich entschied mich für etwas ganz anderes: Jetzt wird nur die Anzahl der Tage seit vor dem aktuellen Urlaub berechnet.

meine Funktion:

def get_nearest_holiday(holidays, pivot): 
    return min(holidays, key=lanbda x: abs(x- pivot) 
    # this needs to be converted to an int, but at least the nearest holiday is found efficiently 

als Lambda-Ausdruck auf einer pro-Zeile-Basis genannt wird

0

Um dies zu tun, beide Datenrahmen verbinden eine gemeinsame Spalte und dann versuchen, diesen Code

import pandas 
import numpy as np 
df = pandas.DataFrame(columns=['to','fr','ans']) 
df.to = [pandas.Timestamp('2014-01-24'), pandas.Timestamp('2014-01-27'), pandas.Timestamp('2014-01-23')] 
df.fr = [pandas.Timestamp('2014-01-26'), pandas.Timestamp('2014-01-27'), pandas.Timestamp('2014-01-24')] 
df['ans']=(df.fr-df.to) /np.timedelta64(1, 'D') 
print df 

Ausgang

  to   fr ans 
0 2014-01-24 2014-01-26 2.0 
1 2014-01-27 2014-01-27 0.0 
2 2014-01-23 2014-01-24 1.0