Объединить несколько файлов данных (с несколькими столбцами), которые являются частями временного ряда - PullRequest
1 голос
/ 09 июля 2019

У меня есть данные нескольких временных рядов (текстовые файлы), которые образуют один временной ряд. Вот упрощенный пример:

    import pandas as pd
    import datetime as dt

    df1_1 = pd.DataFrame({'Date': [15/03/2019 10:00:11.000, 15/03/2019 10:00:12.000 , 15/03/2019 10:00:13.000],
   'Cond [mS/cm]': [7.45, 7.45, 7.45],
   'Temp [C]': [8.22, 8.22, 8.22],
    'Sal [PSU]': [7.63, 7.63, 7.63]})

    df1_2 = pd.DataFrame({'Date': [30/03/2019 10:00:11.000, 30/03/2019 10:00:12.000 , 30/03/2019 10:00:13.000],
   'Cond [mS/cm]': [7.45, 7.45, 7.45],
   'Temp [C]': [8.22, 8.22, 8.22],
    'Sal [PSU]': [7.63, 7.63, 7.63]})

    df2_1 = pd.DataFrame({'Date': [15/03/2019 10:00:11.000, 15/03/2019 10:00:12.000 , 15/03/2019 10:00:13.000],
   'Cond_2 [mS/cm]': [7.47, 7.47, 7.47],
   'Temp_2 [C]': [8.22, 8.22, 8.22],
    'Sal_2 [PSU]': [7.67, 7.67, 7.67]})  

     df2_2 = pd.DataFrame({'Date': [30/03/2019 10:00:11.000, 30/03/2019 10:00:12.000 , 30/03/2019 10:00:13.000],
   'Cond_2 [mS/cm]': [7.47, 7.47, 7.47],
   'Temp_2 [C]': [8.22, 8.22, 8.22],
    'Sal_2 [PSU]': [7.67, 7.67, 7.67]}) 

Где df1 означает данные от датчика 1, df1_1 и df_2 - это следующие фрагменты временного ряда.

Я хочу объединить все в один большой DataFrame.

Пока что я:

  • генерируемый файл, содержащий полный временной ряд (данные от датчиков может иметь неожиданные пробелы),
  • читать файлы как DataFrames,
  • определенные заголовки,
  • установить столбец «Дата» как index каждого DataFrame.

Тогда я хотел бы join DataFrames до полного временного ряда:

full_date = dates.join([df1_1, df1_2], how = "outer")  

но я получил ошибку:

ValueError: Индексы имеют перекрывающиеся значения: Index (['Cond [mS / cm]', «Нажмите [DBar]», «Temp [C]», «Sal [PSU]», 'Dens.anom [кг / м3]', 'SOS [м / с]'], DTYPE = 'объект')

Чтобы проверить, действительно ли проблема в заголовках, я объединил файлы с немного разными заголовками (разные заголовки = разные датчики). Тогда я получил:

    complete_df = ({' ':[01/04/2019 00:00:01, 01/04/2019 00:00:01 , 01/04/2019 00:00:01,
    'Cond [mS/cm]': [NaN, NaN, NaN],
    'Temp [C]': [NaN, NaN, NaN],
    'Sal [PSU]': [NaN, NaN, NaN],
    'Cond_2 [mS/cm]': [NaN, NaN, NaN],
    'Temp_2 [C]': [NaN, NaN, NaN],
    'Sal_2 [PSU]': [NaN, NaN, NaN]}) 

это вполне разумно, за исключением того, что данные не в правильном порядке.

Мой вопрос: как мне объединить все Dataframes, чтобы получить один большой DataFrame?

1 Ответ

1 голос
/ 09 июля 2019

Передайте ваши даты в виде строк, а затем конвертируйте их в DateTime. После этого используйте pd.concat. По-прежнему существует проблема, связанная с тем, что вы дублируете столбцы потенциально без необходимости (Cond [мСм / см], Cond_2 [мСм / см]). В качестве альтернативы вы можете присвоить всем столбцам одинаковые имена и передать один дополнительный столбец с идентификатором датчика (т. Е. «Датчик»: 1)

import pandas as pd

df1_1 = pd.DataFrame({'Date': ['15/03/2019 10:00:11.000', '15/03/2019 10:00:12.000' , '15/03/2019 10:00:13.000'],
'Cond [mS/cm]': [7.45, 7.45, 7.45],
   'Temp [C]': [8.22, 8.22, 8.22],
    'Sal [PSU]': [7.63, 7.63, 7.63]})

df1_2 = pd.DataFrame({'Date': ['30/03/2019 10:00:11.000', '30/03/2019 10:00:12.000' , "30/03/2019 10:00:13.000"],
   'Cond [mS/cm]': [7.45, 7.45, 7.45],
   'Temp [C]': [8.22, 8.22, 8.22],
    'Sal [PSU]': [7.63, 7.63, 7.63]})

df2_1 = pd.DataFrame({'Date': ['15/03/2019 10:00:11.000', '15/03/2019 10:00:12.000' , '15/03/2019 10:00:13.000'],
   'Cond_2 [mS/cm]': [7.47, 7.47, 7.47],
   'Temp_2 [C]': [8.22, 8.22, 8.22],
    'Sal_2 [PSU]': [7.67, 7.67, 7.67]})  

df2_2 = pd.DataFrame({'Date': ['30/03/2019 10:00:11.000', '30/03/2019 10:00:12.000' , '30/03/2019 10:00:13.000'],
   'Cond_2 [mS/cm]': [7.47, 7.47, 7.47],
   'Temp_2 [C]': [8.22, 8.22, 8.22],
    'Sal_2 [PSU]': [7.67, 7.67, 7.67]}) 

complete_df  = pd.concat([df1_1,df1_2,df2_1,df2_2],ignore_index=True)
complete_df['Date'] = pd.to_datetime(complete_df['Date'])
complete_df.set_index('Date', inplace=True)
complete_df.fillna(0)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...