2014-02-19 2 views
5

Ich habe ein DataFrame, das zwei Timestamp-Spalten hat, von denen eine als Index für das Resampling verwendet wird, die andere bleibt als Spalte. Wenn ich den DataFrame resample, wird der als Spalte verbleibende gelöscht. Ich möchte es neu abgetastet werden, als ob es sich um eine numerische Spalte waren (was es wirklich ist):Pandas löscht Timestamp-Spalten in Resample

import numpy as np 
import pandas as pd 
init_time=pd.date_range(start='2010-01-01 00:00', end='2010-01-05 00:00', freq='12H') 
valid_time=pd.date_range(start='2010-01-01 00:00', end='2010-01-05 00:00', freq='12H') 
data = np.random.random(len(valid_time)) 
frame = pd.DataFrame(index=valid_time, data=data) 
frame['init_time'] = init_time 

Datenrahmen hat einen Index, 1 numerische Spalte und eine Spalte Zeitstempel

     0   init_time 
2010-01-01 00:00:00 0.869667 2010-01-01 00:00:00 
2010-01-01 12:00:00 0.225805 2010-01-01 12:00:00 
2010-01-02 00:00:00 0.348080 2010-01-02 00:00:00 
2010-01-02 12:00:00 0.761399 2010-01-02 12:00:00 
2010-01-03 00:00:00 0.645069 2010-01-03 00:00:00 
2010-01-03 12:00:00 0.133111 2010-01-03 12:00:00 
2010-01-04 00:00:00 0.314302 2010-01-04 00:00:00 
2010-01-04 12:00:00 0.130491 2010-01-04 12:00:00 
2010-01-05 00:00:00 0.621703 2010-01-05 00:00:00 

Jetzt neu berechnen täglich:

daily = frame.resample('D', how='mean') 

      0 
2010-01-01 0.547736 
2010-01-02 0.554740 
2010-01-03 0.389090 
2010-01-04 0.222396 
2010-01-05 0.621703 

Meine init_time Säule fallen gelassen wurde. Ich könnte es zuerst in eine rohe Integer-Spalte umwandeln, aber gibt es einen einfacheren Weg?

Antwort

1

Dies gilt nicht für datelike (arithmetisches Mittel) umgesetzt, aber man kann es auf diese Weise tun:

die numerischen Ergebnisse

In [48]: numeric = frame.resample('D',how='mean') 

Holen Sie sich die datelike Ergebnisse. Zuerst erhalten Sie die Spalten, die datumlich sind

In [49]: datelike = frame.loc[:,frame.dtypes.isin([np.dtype('datetime64[ns]')])] 

Dann resample sie; Sie müssen sie als ganze Zahlen betrachten, um sie zu berechnen. Timestamp wird diesen Schwimmer Eingang behandeln (und im wesentlichen rund zur nächsten Nanosekunde)

In [50]: datelike = datelike.resample('D', 
     how=lambda x: Timestamp(x.view('i8').mean())) 

sie zusammen zurück

In [51]: concat([numeric,datelike],axis=1) 
Out[51]: 
        0   init_time 
2010-01-01 0.798880 2010-01-01 06:00:00 
2010-01-02 0.859781 2010-01-02 06:00:00 
2010-01-03 0.515503 2010-01-03 06:00:00 
2010-01-04 0.505557 2010-01-04 06:00:00 
2010-01-05 0.979835 2010-01-05 00:00:00 

[5 rows x 2 columns] 
+0

Danke, das ist im Wesentlichen die Abhilfe, die ich bin mit. Ich frage mich, ob es einen Wunsch gibt, optional eine Resampling-Funktion pro Spalte in Pandas anzugeben? – samwise

+0

könnte man es auch mit TimeGroup über eine groupby machen. Ich nehme an, Sie könnten eine Signatur haben wie: '' df.resamplee (freq .... how = {Spalten: func .....}, how_default = default_function) '' um Spaltenüberschreibungen und einen Standardwert zu haben. Pls Datei ein Problem auf GitHub dafür. (und eine PR wäre noch besser!) – Jeff

+0

OK, werde es versuchen. Könnte meine erste PR sein. – samwise