我根据文件名读取每日文件,其中包含日期,并附加它们。有时文件丢失,但随机日期。这会阻止我的代码运行 - 我放了一个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的行为,如果文件丢失,它会忽略它,但我更喜欢能够读取一定天数或根据月初读取(创建一个月到...)日期文件)。
答案 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)