Чтение нескольких CSV-файлов, сохраненных по дате от начальной до конечной даты, в pandas фрейм данных - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть ситуация, когда мои данные хранятся в S3 по дате. Таким образом, в области с именем mydata папка 2020-01-01 содержит один файл CSV, затем папка 2020-01-02 содержит другой файл CSV и так далее. Я хочу написать функцию, в которой пользователь вводит дату начала и дату окончания, а функция считывает все CSV-файлы между этими датами и объединяет их в один фрейм данных. Один из способов сделать это - ниже, но это кажется неуклюжим и медленным. Есть ли способ лучше?

# Load libraries
import pandas as pd
import dask.dataframe as dd

# Define bucket, and start and end dates
bucket = 'mydata'
start_date = '2019-07-09'
end_date = '2019-07-12'

def read_data(bucket, start_date, end_date):
    # Initialize list of dataframes
    dfs = []

    # Get range of dates from which to read data
    time_range = pd.date_range(start=start_date, end=end_date, freq='D')

    # Read data for each date and append to dfs
    for dte in time_range:
        d = str(dte).split(' ')[0]
        df = dd.read_csv('s3://{}/{}/*.csv'.format(bucket, d)).compute()
        dfs.append(df)

    # Concatenate dfs into one df
    merged_df = pd.concat(dfs, 0)

    return merged_df

1 Ответ

0 голосов
/ 15 апреля 2020

Вот как я бы это сделал,

  • Создание списка объектов файлов Pathlib
  • Создание фрейма данных и использование регулярных выражений для извлечения даты
  • Взять ввод даты начала и окончания и фильтрация фрейма данных по этому.
  • concat список файлов, основанный на вышеупомянутом фильтре.

Естественно, вы должны добавить некоторую обработку ошибок в ваши даты и времени.


import pandas as pd
from pathlib import Path

path = '\tmp\s3\bucket\files'

df = pd.DataFrame({'files' : [f for f in Path(path).glob('*.csv')],
                  'stem' : [f.stem for f in Path(path).glob('*.csv')]})


df['date'] = pd.to_datetime(df['stem'].str.extract('(\d{4}-\d{2}-\d{2})')[0])

print(df)

                                  files             stem       date
0  \tmp\s3\bucket\files\file-2020-04-15  file-2020-04-15 2020-04-15
1  \tmp\s3\bucket\files\file-2020-04-16  file-2020-04-16 2020-04-16
2  \tmp\s3\bucket\files\file-2020-04-17  file-2020-04-17 2020-04-17
3  \tmp\s3\bucket\files\file-2020-04-18  file-2020-04-18 2020-04-18
4  \tmp\s3\bucket\files\file-2020-04-19  file-2020-04-19 2020-04-19

start_date = input('Enter your Start Date')
end_date = input('Enter your End Date')

при условии, что эти даты равны '2020-04-15' и '2020-04-16', мы можем вернуть список на основе этого диапазона

Объединить фрейм данных.

file_date_slice = df.set_index('date').loc[start_date:end_date]['files'].tolist()


concat_df = pd.concat([dd.read_csv(f).compute() for f in file_date_slice])
...