即使缺少文件,也要合并文件?

时间:2016-01-17 03:40:43

标签: python pandas

我根据文件名读取每日文件,其中包含日期,并附加它们。有时文件丢失,但随机日期。这会阻止我的代码运行 - 我放了一个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 个答案:

答案 0 :(得分: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)