File containing filenames with dates, want to get filenames for the first available date of each month
这个问题类似于我之前提到的一个问题:从字符串列表中提取某些元素并使用Pandas转换为datetime
但是,想象一下有一个包含许多文件的文件夹(csv's)....它们都是从2004年到2017年的格式,文件有点像天花板,因为有时它们是每日频率,但可以是每月。此外,没有已知的文件名约定模式,但日期始终在yyyymmdd格式的文件中,并且都在2000之后,文件名中没有20个数字:
例如,X = ['director_send_20140212ds.csv','send20140213abs.csv','mike20140214.csv',....等]
我想获取仅包含该月第一个日期的文件名的文件名。例如,如果数据从2000年到2017年开始,我只需要一个包含该月第一天的文件名列表(它们是可用的文件)。因此,列表将比可用列表小得多,但仅提供该月第一天的FILENAME。如果有一个文件的月份的第一天是第10天,它将被包括在内,如果没有特定月份的文件名,它将进入下个月。
所以,最终如果有一个每日频率文件名的理想世界,我们将获得特定年份的12个文件名。
我这样做:
文件名来源列表:
1 2 3 4 5 6 7 | In [43]: X = ['director_send_20140212ds.csv', ....: 'send20140213abs.csv', ....: 'mike20140214.csv', ....: 'director_send_20140430ds.csv', ....: 'send20140402abs.csv', ....: 'mike20141214.csv', ....: ] |
让我们创建一个DF:
1 | In [44]: df = pd.DataFrame({'fn':X}) |
现在让我们解析文件名中的日期:
1 | In [45]: df['date'] = pd.to_datetime(df['fn'].str.extract(r'.*(\d{8}).*', expand=False)) |
现在我们可以轻松找到每月的最短日期
1 2 3 4 5 6 | In [47]: df.loc[df.groupby([df.date.dt.year, df.date.dt.month])['date'].idxmin(), 'fn'] Out[47]: 0 director_send_20140212ds.csv 4 send20140402abs.csv 5 mike20141214.csv Name: fn, dtype: object |
我相信,不是从文件名中提取日期,而是更容易迭代日期,并匹配相应的文件名:
1 2 3 4 5 6 7 8 | # first, list all files import os files = pd.Series(os.listdir('path_to_folder')) # second, iterate over dates for date in pd.date_range('2000-01-01', '2017-01-01', freq='MS').strftime('%Y%m%d'): for file_name in files[files.str.contains(date)]: print(file_name) # do what you need to do |
请注意,由于问题用pandas标记,我使用pandas功能来(a)生成日期范围和(b)匹配文件名中的日期。