2013-07-23 3 views
1

Во-первых, вот что выглядит мои данные .xlsx таймсерия как:Получить список строк из индекса столбца панд dataframe

What the data looks like in excel

и вот как я читаю его:

def loaddata(filepaths): 
    t1 = time.clock() 
    for i in range(len(filepaths)): 
     xl = pd.ExcelFile(filepaths[i]) 
     df = xl.parse(xl.sheet_names[0], header=0, index_col=2, skiprows=[0,2,3,4], parse_dates=True) 
     df = df.dropna(axis=1, how='all') 
     df = df.drop(['Decimal Year Day', 'Decimal Year Day.1', 'RECORD'], axis=1) 
     df.index = pd.DatetimeIndex(((df.index.asi8/(1e9*60)).round()*1e9*60).astype(np.int64)).values 

     if i == 0: 
      dfs = df 
     else: 
      dfs = concat([dfs, df], axis=1) 

    t2 = time.clock() 
    print "Files loaded into dataframe in %s seconds" %(t2-t1) 

    return dfs 

files = ["London Lysimeters corrected 5min.xlsx"] 
data = loaddata(files) 

Что мне нужно сделать, это прочитать метки столбцов AND и строки (строки 2 и 3), а также значения в кадре данных pandas и получить доступ к строкам меток и единиц в виде списка строк. Я не могу понять, как загрузить оба строки 2 и 3 и правильно прочитать время в pandas datetimeindex, но он отлично работает, если я загружаю только метки. Также я повсюду посмотрел и не могу понять, как получить заголовки столбцов в виде списка.

Я был бы признателен, если бы кто-нибудь мог помочь в решении любой из этих проблем.

ответ

1

Прежде всего, избавитесь от этого for i in range(len(filepaths))! Пифонический путь - for i, filepath in enumerate(filepaths). enumerate дает кортеж, поэтому вы можете сказать ExcelFile(filepath) вместо ExcelFile(filepaths[i]).

Я думаю, что ваши две проблемы связаны. Если я правильно читаю ваш код, когда вы включаете строки 2 и 3, даты не могут быть проанализированы, поскольку столбец timestamp не является однородным. Это не все временные метки.

Вы можете использовать Hierarchical index, чтобы получить данные в формате (column, label, unit). Вероятно, проще всего сначала прочитать только информацию заголовка. Затем прочитайте данные отдельно и установить столбцы после факта (я не имею первенствовать под рукой прямо сейчас, но я думаю, что все read_csv варианты, которые я использую доступны xlrd также):

In [7]: df_header = pd.read_csv('test.csv', nrows=2, index_col='three') 

In [8]: df_header 
Out[8]: 
       one  two four 
three        
Timestamp Decimal Decimal record 
ts    ref  ref  rn 

In [9]: df_data = pd.read_csv('test.csv', names=df_header.columns, 
    ...:      skiprows=4, parse_dates=True, index_col=2) 

In [10]: df_data 
Out[10]: 
         one two four 
2012-08-29 07:10:00 32.1 32.0 232 
2012-08-29 09:10:00 1.1 1.2 233 

In [11]: cols = pd.MultiIndex.from_tuples([tuple([x] + df_header[x].tolist()) 
    ....:         for x in df_header]) 

In [12]: cols 
Out[12]: 
MultiIndex 
[one Decimal ref, two Decimal ref, four record rn ] 

In [14]: df_data.columns = cols 

In [15]: df_data 
Out[15]: 
         one  two four 
        Decimal Decimal record 
         ref  ref  rn 
2012-08-29 07:10:00  32.1  32.0  232 
2012-08-29 09:10:00  1.1  1.2  233 

Это должно получить вас до точки в вашем коде, где вы начинаете отбрасывать столбцы и начинаете конкатенацию. Также взгляните на developers docs. Похоже, что синтаксис для чтения файлов excel очищается (гораздо лучше!). Возможно, вы сможете использовать аргумент parse_cols со списком целых чисел, чтобы избежать удаления столбцов позже.

Ох, и вы можете получить список строк с df_data.columns.tolist()

+0

К сожалению, я не могу сделать двойной чтения, как это требуется, чтобы загрузить 30-40-е годы на каждый лист и программа будет необходимо загрузить 12-16 листов одинаковый размер каждый раз, и хотя первое чтение на файл мало, он все равно занимает довольно много времени, чтобы начать работу. Тем не менее, возможность получить строки будет очень удобна, так как я могу использовать их для создания комбинированного блока сейчас и построения данных, без каких-либо единиц в данный момент. Спасибо за это! – pbreach

+0

Возможно, посмотрите на настройку размера блока, равного длине заголовка, и объедините все, кроме первого фрагмента. Это разделит его на заголовок, данные, только открывая каждый файл один раз. – TomAugspurger

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