Я читаю ежедневные файлы на основе имени файла, который включает дату и добавляет их. Иногда файл отсутствует, хотя для случайной даты. Это останавливает мой код от запуска - я помещаю 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, где он игнорирует, если файл отсутствует, но я предпочитаю, чтобы быть в состоянии прочитать определенное количество дней или читать на основе начала месяца (для создания месячный файл).
Say Я читаю 3 различных файлов (file_a, file_b, file_c) для всех даты в декабре 2015 года. Мой текущий код не будет читать все файлы без проблем, но если отсутствует одна дате в файле file_c, то весь полный фреймворк - None, поэтому я не могу выполнять операции над ним. Надеюсь, что это более понятно. – trench
Я вижу, что отсутствующая дата находится внутри файла - обновленный ответ. Вам нужно передать свой собственный синтаксический анализатор даты, поэтому убедитесь, что вы настраиваете 'strptime', чтобы принять формат, который вы ожидаете. Если дата отсутствует, вы вместо этого возвращаете объект 'datetime' с сегодняшней датой. –
Добавление попытки, за исключением цикла, как вы предложили, отлично работает. Благодарю. – trench