Pandas удаляет столбцы временных меток при повторной выборке

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

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

Теперь пересэмплируйте на daily:

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 был удален. Я мог бы сначала преобразовать его в необработанный целочисленный столбец, но есть ли более простой способ?


person samwise    schedule 19.02.2014    source источник


Ответы (1)


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

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

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

Получите результаты, подобные дате. Сначала получите столбцы, которые похожи на дату

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

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

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]
person Jeff    schedule 19.02.2014
comment
Спасибо, это, по сути, обходной путь, который я использую. Интересно, есть ли желание опционально указать функцию повторной выборки для каждого столбца в Pandas? - person samwise; 20.02.2014
comment
вы также можете сделать это через groupby с TimeGrouper. Я полагаю, у вас может быть подпись, например: df.resamplee(freq....how={ columns : func.....}, how_default = default_function ), чтобы иметь переопределения для каждого столбца и значение по умолчанию. Пожалуйста, создайте проблему на github для этого. (а еще лучше пиар!) - person Jeff; 20.02.2014
comment
Хорошо, постараюсь. Может быть мой первый пиар. - person samwise; 21.02.2014
comment
Вы когда-нибудь представляли проблему для этого? Как начинающий пользователь pandas, я потратил довольно много времени, прежде чем обнаружил, что DataFrame.resample молча удаляет мой столбец типа timedelta64. Я рад, что нашел этот вопрос и ответ здесь, который дал мне подсказку, что искать. - person Phil; 16.11.2015