2015-08-20 2 views
0

Допустит, у меня есть pandas.DataFrame, который имеет почасовые данные в течение 3 дней:Разделительной панды dataframe офсетной строкой

import pandas as pd 
import numpy as np 
import datetime as dt 
dates = pd.date_range('20130101', periods=3*24, freq='H') 
df = pd.DataFrame(np.random.randn(3*24,2),index=dates,columns=list('AB')) 

Я хотел бы получить каждый, скажем, 6 часов данных и независимо друг от друга поместить кривой это данные. Поскольку функция pandas 'resample имеет ключевое слово , которое должно быть any numpy array function, я подумал, что, возможно, я попытаюсь использовать resample, чтобы сделать это с помощью polyfit, но, видимо, нет способа (не так ли?).

Так что единственный альтернативный способ я думал сделать что отделяющий df в последовательность DataFrame с, так что я пытаюсь создать функцию, которая будет работать, такие как

l=splitDF(df, '6H') 

и вернется ко мне список данных, каждый из которых содержит 6 часов данных (за исключением, возможно, первого и последнего). До сих пор я не получил ничего, что могло работать только что-то вроде следующего ручного метода:

def splitDF(data, rule): 
     res_index=data.resample(rule).index 
     out=[] 
     cont=0 
     for date in data.index: 
       ... check for date in res_index ... 
       ... and start cutting at those points ... 

Но этот метод будет очень медленным, и, вероятно, более быстрый способ сделать это. Есть ли быстрый (возможно, даже питонический) способ сделать это?

Спасибо!

EDIT

Лучший метод (который нуждается в некотором улучшении, но это быстрее) будет следующим:

def splitDF(data, rule): 
    res_index=data.resample(rule).index 
    out=[] 
    pdate=res_index[0] 
    for date in res_index: 
      out.append(data[pdate:date][:-1]) 
      pdate=date 
    out.append(data[pdate:]) 
    return out 

Но все-таки мне кажется, что там должен быть лучший способ.

ответ

0

Как насчет?

np.array_split(df,len(df)/6) 
+1

Это предложение для решения. Как насчет? спрашивал OP, если решение получит его, что ему нужно. Я удивлен, что это нужно объяснить. – JAB

+0

Я пробовал это, но получается, когда индекс является датой, это разделяет df неравномерно. – TomCho

1

Ok, так что это звучит как учебник случае для использования groupby. Вот мои мысли:

import pandas as pd 

#let's define a function that'll group a datetime-indexed dataframe by hour-interval/date 
def create_date_hour_groups(df, hr): 
    new_df = df.copy() 
    hr_int = int(hr) 
    new_df['hr_group'] = new_df.index.hour/hr_int 
    new_df['dt_group'] = new_df.index.date 
    return new_df 

#now we define a wrapper for polyfit to pass to groupby.apply 
def polyfit_x_y(df, x_col='A', y_col='B', poly_deg=3): 
    df_new = df.copy() 
    coef_array = pd.np.polyfit(df_new[x_col], df_new[y_col], poly_deg) 
    poly_func = pd.np.poly1d(coef_array) 
    df_new['poly_fit'] = poly_func(df[x_col]) 
    return df_new 

#to the actual stuff 
dates = pd.date_range('20130101', periods=3*24, freq='H') 
df = pd.DataFrame(pd.np.random.randn(3*24,2),index=dates,columns=list('AB')) 
df = create_date_hour_groups(df, 6) 
df_fit = df.groupby(['dt_group', 'hr_group'], 
        as_index=False).apply(polyfit_x_y) 
+0

Это очень хорошее мышление. Я не могу реализовать его прямо сейчас (я сделаю это, когда я буду моим компьютером), но я вижу это. Только проблема заключается в том, что если имена, если столбцы меняются, мне тоже придется менять 'polyfit_x_y', верно? Другое дело, что я действительно хотел подогнать кривую, основанную на индексе datetime. Но это можно легко устранить. – TomCho

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