关于python:包含带日期的文件名的文件,想要获取每个月第一个可用日期的文件名

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)匹配文件名中的日期。