2016-06-06 14 views
0

Angesichts der folgenden Datenrahmen:Pandas erstellen Datumsbereich Ohne Wochenenden

import pandas as pd 
df=pd.DataFrame({'A':['a','b','c'], 
     'first_date':['2015-08-31 00:00:00','2015-08-24 00:00:00','2015-08-25 00:00:00']}) 
df.first_date=pd.to_datetime(df.first_date) #(dtype='<M8[ns]') 
df['last_date']=pd.to_datetime('5/6/2016') #(dtype='datetime64[ns]') 
df 

    A first_date last_date 
0 a 2015-08-31 2016-05-06 
1 b 2015-08-24 2016-05-06 
2 c 2015-08-25 2016-05-06 

Ich möchte eine neue Spalte erstellen, die die Liste (oder Array) enthält der Daten zwischen ‚first_date‘ und ‚last_date‘ was Wochenenden ausschließt.

Bisher habe ich versucht, dies:

pd.date_range(df['first_date'],df['last_date']) 

... aber dieser Fehler auftritt:

TypeError: Cannot convert input to Timestamp 

Ich habe auch versucht, diese vor pd.date_range ...

pd.Timestamp(df['first_date']) 

... aber keine Würfel.

Vielen Dank im Voraus!

PS:

Nach dieser Hürde, ich werde in anderen Listen von Terminen versuchen, suchen und, wenn sie innerhalb des erzeugten Array fallen (pro Zeile in ‚A‘), so dass sie dann aus der Liste subtrahiere oder Array). Ich werde es als eine separate Frage veröffentlichen.

Antwort

2

freq='B' gibt Ihnen Werktage, oder keine Wochenenden.

Ihr Fehler:

TypeError: Cannot convert input to Timestamp

Ist das Ergebnis der Sie eine Reihe an die pd.date_range Funktion übergeben, wenn es eine Timestamp

Stattdessen erwarten, apply verwenden.

Allerdings finde ich es immer noch schwierig, Listen in bestimmte Zellen von Datenrahmen zu bekommen. Die Art, wie ich benutze, ist eine pd.Series([mylist]) zu verwenden. Beachten Sie, dass es sich um eine Liste einer Liste handelt. Wenn es nur pd.Series(mylist) Pandas wäre würde die Liste in eine Serie konvertieren und Sie würden eine Reihe von Serien, die ein Dataframe ist.

Versuch:

def fnl(x): 
    l = pd.date_range(x.loc['first_date'], x.loc['last_date'], freq='B') 
    return pd.Series([l]) 

df['range'] = df.apply(fnl, axis=1) 
+0

Dank! Wie kommt es, dass Sie die Anforderung für einen Zeitstempel umgehen, indem Sie auf den Datenrahmen anwenden und eine Liste mit einer Liste aufnehmen? –

+1

Sie haben 'date_range (timeseries1, timeseries2)' gemacht, wenn es 'date_range (timestamp1, timestampe2)' hätte sein sollen. Mit 'apply (axis = 1)' gehen wir Zeile für Zeile, greifen die Zeitstempel für diese Zeile und erhalten den Datumsbereich für diese Zeile. Die Serie/listOlist-Sache ist nur ein Trick, um die Liste in eine einzelne Datenzellenzelle zu bringen. Wir hätten auch andere Dinge tun können. – piRSquared

+0

Danke nochmal. Follow-up Frage hier gepostet: http://stackoverflow.com/questions/37653493/pandas-remove-elements-from-datetimeindex-per-list-elements-in-range –