Импортируйте каталог файлов CSV сразу и сохраняйте только самую старую запись на файл - PullRequest
2 голосов
/ 25 октября 2019

У меня есть база данных, содержащая несколько CSV-файлов. Каждый CSV-файл содержит последние 7 дней, и только самая старая дата является окончательной.

Например, файл «variable_2019-08-12.csv» содержит данные с 08-06 по 08-12 (только данные 08-06 являются окончательными данными), а файл «variable_2019-08-13.csv» содержитданные с 08-07 до 08-13 (только 08-07 данные являются окончательными данными). Я хочу сохранить только записи на дату 08-06 из файла variable_2019-08-12.csv и записи на дату 08-07 из файла variable_2019-08-13.csv и так далее. Сервер выдает каждые данные 7 раз в течение 7 дней и только через 7 дней данные считаются окончательными. Данные после импорта будут выглядеть следующим образом:

import pandas as pd

source = ["data/variables_2019-08-12.csv",
"data/variables_2019-08-12.csv",
"data/variables_2019-08-12.csv", "data/variables_2019-08-12.csv",
"data/variables_2019-08-12.csv", "data/variables_2019-08-12.csv",
"data/variables_2019-08-12.csv", "data/variables_2019-08-13.csv",
"data/variables_2019-08-13.csv", "data/variables_2019-08-13.csv",
"data/variables_2019-08-13.csv", "data/variables_2019-08-13.csv",
"data/variables_2019-08-13.csv", "data/variables_2019-08-13.csv"]
date = ["2019-08-06", "2019-08-07", "2019-08-08", "2019-08-09",
"2019-08-10", "2019-08-11", "2019-08-12", "2019-08-07","2019-08-08",
"2019-08-09", "2019-08-10", "2019-08-11", "2019-08-12","2019-08-13"]
id = [18404487, 18404487, 18502437, 18502437, 18502437, 18502437,
18502437, 18502437, 18502437, 18502437, 18502437, 18502437,18502437, 18502437]
usage = [11, 146, 41, 1, 2, 8, 2, 152, 42, 1, 5, 100, 2, 15]


dict = {'source': source, 'date': date, 'id': id, 'usage': usage}

df = pd.DataFrame(dict)

Я читаю все файлы CSV одновременно, затем группирую по столбцу источника и фильтрую и сохраняю только самую старую дату из каждого источника. Что я тут не так делаю?

    # group by source
    # filter only oldest date
    # ungroup dataframe
    df['date'] =  pd.to_datetime(df['date'])
   df.groupby('source').filter(lambda x: (x['date'].min())).reset_index()

#error 
filter function returned a Timestamp, but expected a scalar bool

1 Ответ

1 голос
/ 25 октября 2019

IIUC,

если у вас уже есть сцепленный df, вы можете использовать функцию .agg в groupby, которая позволяет получить доступ к столбцам

df.groupby('source').agg({'date' : min})

, заметьте, что этотакой же как

df.groupby('source')['date'].min().reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...