2017-01-16 2 views
0

Lassen Sie sich einen Datenrahmen betrachten, die für jeden Tag des Monats Januar 2010 1 Reihe 2 Werte enthalten:Python, Pandas: Reindex/Scheibe Datenrahmen mit doppelten Indexwerten

date_range = pd.date_range(dt(2010,1,1), dt(2010,1,31), freq='1D') 
df = pd.DataFrame(data = np.random.rand(len(date_range),2), index = date_range) 

und andere timeserie mit spärlichen Daten und doppelte Indexwerte:

observations = pd.DataFrame(data =np.random.rand(7,2), index = (dt(2010,1,12), 
dt(2010,1,18), dt(2010,1,20), dt(2010,1,20), dt(2010,1,22), dt(2010,1,22),dt(2010,1,28))) 

gespalten ich den ersten Datenrahmen df in eine Liste von 5 Datenrahmen, jeder von ihnen enthält, 1 Woche im wert von Daten aus dem Original: df_weeks = [g for n, g in df.groupby(pd.TimeGrouper('W'))]

Jetzt möchte ich die Daten des zweiten DataFrame um die gleichen 5 Wochen teilen. h., das würde in diesem speziellen Fall bedeuten, dass es mit einer Variablen obs_weeks endet, die 5 DataFrames enthält, die den gleichen Zeitraum wie df_weeks überspannen, von denen 2 leer sind.

Ich versuchte reindex wie in dieser Frage mit: Python, Pandas: Use the GroupBy.groups description to apply it to another grouping

und Perioden:

p1 =[x.to_period() for x in list(df.groupby(pd.TimeGrouper('W')).groups.keys())] 
p1 = sorted(p1) 
dfs=[] 
for p in p1: 
    dff = observations.truncate(p.start_time, p.end_time) 
    dfs.append(dff) 

(diese Frage sehen: Python, Pandas: Boolean Indexing Comparing DateTimeIndex to Period)

Das Problem ist, dass, wenn einige Werte in dem Index von observations sind Duplikate (und dies ist der Fall) keine dieser Methodenfunktionen. Ich habe auch versucht, den Index von observations zu einer normalen Spalte zu ändern und das Slicing für diese Spalte zu machen, aber ich habe auch eine Fehlermeldung erhalten.

Antwort

1

Sie können dies erreichen, indem Sie einen einfachen Filter tun:

p1 = [x.to_period() for x in list(df.groupby(pd.TimeGrouper('W')).groups.keys())] 
p1 = sorted(p1) 
dfs = [] 
for p in p1: 
    dff = observations.ix[ 
     (observations.index >= p.start_time) & 
     (observations.index < p.end_time)] 
    dfs.append(dff) 
Verwandte Themen