2016-12-02 2 views
0

У меня есть панд набор данных, как это:Панды конкатенации/присоединиться к/группы строк в dataframe на основе даты

   Date  WaterTemp Discharge AirTemp  Precip 
0  2012-10-05 00:00  10.9  414.0 39.2   0.0 
1  2012-10-05 00:15  10.1  406.0 39.2   0.0 
2  2012-10-05 00:45  10.4  406.0 37.4   0.0 
... 
63661 2016-10-12 14:30  10.5  329.0 15.8   0.0 
63662 2016-10-12 14:45  10.6  323.0 19.4   0.0 
63663 2016-10-12 15:15  10.8  329.0  23   0.0 

Я хочу продлить каждую строку, так что я получаю набор данных, который выглядит как:

   Date WaterTemp 00:00 WaterTemp 00:15 .... Discharge 00:00 ... 
0  2012-10-05    10.9    10.1    414.0 

Для каждой даты должно быть не более 72 показаний, поэтому у меня должно быть 288 столбцов в дополнение к столбцам даты и индекса, и самое большее я должен иметь не более 1460 строк (4 года * 365 дней в году - возможно, некоторые отсутствующие даты). В конце концов, я буду использовать набор данных 288-столбцов в задаче классификации (я буду добавлять метку позже), поэтому мне нужно преобразовать эту фреймворк в 2-й массив (без datetime) для подачи в классификатор, поэтому я могу ' t просто группировать по дате и затем обращаться к группе. Я попытался сгруппировать по дате, но я не знал, как изменить каждую группу в одну строку. Я также посмотрел на присоединение. Похоже, что присоединение может соответствовать моим потребностям (например, соединение основано на (день, месяц, год)), но я не знал, как разделить вещи на разные кадры данных pandas, чтобы соединение работало. Каков способ сделать это?

PS. Я уже знаю, как изменить свои даты в столбце Date до дат без времени.

ответ

0

Я понял. Я группирую показания по времени чтения. Каждая группа сама по себе является фреймворком данных, поэтому мне просто нужно объединить данные в зависимости от даты. Мой код для всей функции выглядит следующим образом.

import pandas 

def readInData(filename): 
    #read in files and remove missing values 
    ds = pandas.read_csv(filename) 
    ds = ds[ds.AirTemp != 'M'] 
    #set index to date 
    ds['Date'] = pandas.to_datetime(ds.Date, yearfirst=True, errors='coerce') 
    ds.Date = pandas.DatetimeIndex(ds.Date) 
    ds.index = ds.Date 
    #group by time (so group readings by time of day of reading, i.e. all readings at midnight) 
    dg = ds.groupby(ds.index.time) 

    #initialize the final dataframe 
    df = pandas.DataFrame() 
    for name, group in dg: #for each group 
     #each group is a dateframe 
     try: 
      #set unique column names except for date 
      group.columns = ['Date', 'WaterTemp'+str(name), 'Discharge'+str(name), 'AirTemp'+str(name), 'Precip'+str(name)] 
      #ensure date is the index    
      group.index = group.Date 
      #remove time from index 
      group.index = group.index.normalize() 
      #join based on date 
      df = pandas.concat([df, group], axis=1) 
     except: #if the try catch block isn't here, throws errors! (three for my dataset?) 
      pass 
    #remove duplicate date columns 
    df = df.loc[:,~df.columns.duplicated()] 
    #since date is index, drop the first date column 
    df = df.drop('Date', 1) 
    #return the dataset 
    return df 
Смежные вопросы