Объединение данных временного ряда из нескольких источников, подмножественных наименее полным набором данных - PullRequest
1 голос
/ 22 сентября 2019

Я создаю скрипт на python, который использует 'n' CSV из одномерных данных.Каждый CSV имеет показания датчика и время (с точностью до минуты), которое было снято.Я хочу объединить все эти сценарии в один CSV, который будет индексировать все данные датчиков по общим временным отметкам, например, ниже

В идеале все n датчиков будут собирать данные за один и тот же период времени, однако будетНебольшое отставание между первым и последним подключенными датчиками.Я предполагаю, что этот код работает так, что подмножество других CSV будет получено с использованием последнего общего времени начала и окончания.

В настоящее время я перебираю локальный каталог и сохраняю свои CSV в виде наборов данных pandas.внутри словаря, индексируя их по столбцу time и используя .concat, чтобы присоединиться к ним.Это работает, пока индексы идентичны;однако я пытаюсь сделать сценарий более устойчивым к незначительным различиям между наборами данных.


Sensor 1           
Time  Reading
11:05  90
11:05  92
11:05  93
11:06  90

Sensor 2
Time  Reading
11:05  93
11:05  95 
11:06  93
11:07  92

Joined csv
Time  Sensor1  Sensor 2
11:05  92       93
11:05  93       95
11:06  90       93
# current code concatenates CSVs but can't deal with minor variations in time indexes

frames = {}
sensors = ['time']

for fname in glob.glob(file):
    files = [i for i in glob.glob(file)]

for i in range(len(files)):
    frames["sensor_{0}".format(i+1)] = pd.read_csv(files[i], usecols=[1,2])

frames = { k: v.set_index('time') for k, v in frames.items()}

dataframe = pd.concat(frames, axis=1) 

dataframe.to_csv(path+"\\concat.csv", index=True, header=False)

dataframe=pd.read_csv(path+"\\concat.csv")

for i in range(len(files)):
    sensors.append('sensor '+ str(1+i))

dataframe.columns = sensors

dataframe['time'] = pd.to_datetime(dataframe['time'])
dataframe = dataframe.set_index('time')

TLDR;Есть ли способ создать объединенный CSV из данных с метками времени, подмножественных общими значениями меток времени по n числу CSV, в Python?

1 Ответ

1 голос
/ 22 сентября 2019

Например, давайте посмотрим на два кадра данных, аналогичные тем, которые вы опубликовали, но с одним назначением данных, смещенным на несколько секунд (я возьму это в качестве примера «незначительного отклонения»).

import pandas as pd

df1 = pd.DataFrame(
    data= [('11:05',90),
           ('11:05',  92),
           ('11:05',  93),
           ('11:06', 90)],
    columns = ('Time', 'Sensor1'))

df2 = pd.DataFrame(
    data= [('11:05',93),
           ('11:05:03',  95),
           ('11:06',  93),
           ('11:07', 92)],
    columns = ('Time', 'Sensor2'))

Прежде всего, мы изменим столбец «Время» из текстового формата в формат pd.Timestamp:

df1['Time'] = df1['Time'].apply(pd.Timestamp)
df2['Time'] = df2['Time'].apply(pd.Timestamp)

Это добавит текущую датусегодня как дата, но это не важно для этого примера.

Чтобы справиться с «незначительными отклонениями», мы можем .resample временной ряд, чтобы выровнять его с временным разрешениемодной минуты (если мы хотим другое разрешение, мы смотрим документы .resample)

df1 = df1.set_index('Time').resample('1T').mean() # mean - just for example; can also be median or some other function
df2 = df2.set_index('Time').resample('1T').mean()

Наконец, мы .join два кадра данных на основе их индекса (что мыустановить время), сохраняя только пересечение в

df1.join(df2, how='inner')

И все!

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