2016-01-17 8 views
0

Я читаю ежедневные файлы на основе имени файла, который включает дату и добавляет их. Иногда файл отсутствует, хотя для случайной даты. Это останавливает мой код от запуска - я помещаю Try Except и он позволяет коду продолжать работать, но любой файл данных с отсутствующей датой в моем диапазоне будет None.Сочетание файлов, даже если их нет?

Есть ли способ прочитать все существующие файлы и объединить их, даже если дата отсутствует? Это была головная боль в течение длительного времени.

start_date = (central_time - pd.Timedelta(days = 4)) - pd.offsets.MonthBegin() 
end_date = central_time - pd.Timedelta(days = 3) 
days = ((pd.Timestamp(end_date) - pd.Timestamp(start_date))/np.timedelta64(1, 'D')).astype(int) 


def last_n_days(filename, num_of_days, include_curr = True): 
    f = '%m_%d_%Y' 
    curr = end_date 
    if include_curr: 
     yield curr.strftime(f) 
    for num in range(num_of_days): 
     curr = curr - dt.timedelta(days = 1) 
     yield curr.strftime(f) 


def read_concat_file(filename, parse_dates = True): 
    df_list = [] 
    try: 
     for file_date in last_n_days(filename, days, False): 
      read_file = '{}{}{}{}'.format(ftp_location, ftp_filename, file_date, '.csv') 
      print('Appending file {}'.format(read_file)) 
      df = pd.read_csv(read_file, parse_dates = parse_dates) 
      df_list.append(df) 
     return pd.concat(df_list) 
    except IOError: 
     print('File does not exist:', read_file) 

Мне нравится поведение glob.glob, где он игнорирует, если файл отсутствует, но я предпочитаю, чтобы быть в состоянии прочитать определенное количество дней или читать на основе начала месяца (для создания месячный файл).

ответ

1

Я поставил Try Except и позволяет коду продолжать работать, но любой датафрейм с отсутствующей датой в моем диапазоне будет None.

Я не знаю, правда ли это. Если файл не найден, ваш for-loop преждевременно выходит и никогда не перезагружается. Вы должны были бы поставить try/except блок внутри цикла for вместо:

def read_concat_file(filename, parse_dates = True): 
    df_list = [] 
    try: 
     for file_date in last_n_days(filename, days, False): 
      try: 
       read_file = '{}{}{}{}'.format(ftp_location, ftp_filename, file_date, '.csv') 
       print('Appending file {}'.format(read_file)) 
       df = pd.read_csv(read_file, parse_dates = parse_dates) 
       df_list.append(df) 
      except IOError: 
       print('File does not exist:', read_file) 
     return pd.concat(df_list) 

Есть ли способ, чтобы прочитать все существующие файлы и объединить их, даже если дата не хватает?

Вы можете предоставить свой собственный дата-анализатор, и сказать ему, чтобы создать дату по умолчанию, когда date пуст:

import datetime as dt 

def date_parser(date): 
    if date is None or date == "": 
     return dt.datetime() 
    else: 
     return dt.datetime.strptime(date, '%d%b%Y') 
... 
pd.read_csv(read_file, parse_dates=parse_dates, date_parser=date_parser) 
+0

Say Я читаю 3 различных файлов (file_a, file_b, file_c) для всех даты в декабре 2015 года. Мой текущий код не будет читать все файлы без проблем, но если отсутствует одна дате в файле file_c, то весь полный фреймворк - None, поэтому я не могу выполнять операции над ним. Надеюсь, что это более понятно. – trench

+1

Я вижу, что отсутствующая дата находится внутри файла - обновленный ответ. Вам нужно передать свой собственный синтаксический анализатор даты, поэтому убедитесь, что вы настраиваете 'strptime', чтобы принять формат, который вы ожидаете. Если дата отсутствует, вы вместо этого возвращаете объект 'datetime' с сегодняшней датой. –

+0

Добавление попытки, за исключением цикла, как вы предложили, отлично работает. Благодарю. – trench