2014-02-19 2 views
5

У меня есть DataFrame, который имеет две столбцы Timestamp, один из которых используется как индекс для повторной выборки, а другой остается в виде столбца. Если я переконвертирую DataFrame, то оставшаяся в качестве столбца будет отброшена. Я хотел бы, чтобы быть преобразован, как если бы это был числовой столбец (что это на самом деле):Pandas падает столбцы метки времени в 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 

DataFrame имеет индекс, 1 числовой столбец и столбец один Timestamp

     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 

Теперь RESAMPLE ежедневно:

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 

Мой init_time колонка уронили. Я мог бы сначала преобразовать его в исходный целочисленный столбец, но есть ли более простой способ?

ответ

1

Это не выполняется для datelike (среднее значение), но вы можете сделать это следующим образом:

Получить числовые результаты

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

Получить результаты datelike. Сначала получите столбцы, которые являются точными данными

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

Затем переделайте их; вам нужно просмотреть их как целые числа для вычисления на них; Отметка будет обрабатывать этот поплавок вход (и, по существу округления до ближайшей наносекунды)

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

Поместите их вместе

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

Спасибо, что по существу обходной путь я использую. Интересно, есть ли какой-либо аппетит для опционального задания функции передискретизации для каждого столбца в Pandas? – samwise

+0

вы можете сделать это через группу с помощью TimeGrouper. Я полагаю, вы могли бы иметь такую ​​подпись, как: '' df.resamplee (freq .... how = {columns: func .....}, how_default = default_function) '' для переопределения по умолчанию и по умолчанию. Pls пишет о проблеме на github для этого. (и PR будет еще лучше!) – Jeff

+0

Хорошо, попробуй. Может быть, мой первый PR. – samwise

Смежные вопросы