包含日期文件名的文件,希望获取每个月第一个可用日期的文件名

时间:2017-01-08 20:39:10

标签: python list pandas

此问题类似于我之前提出的问题:Extracting certain elements from a list of a string and turning into datetime with Pandas

然而,想象一下有一个包含许多文件的文件夹(csv's)....它们都是从2004年到2017年的格式,文件有点像天花板,因为有时它们是每日频率但可以是每月。此外,没有已知的文件名约定模式,但是日期始终在yyyymmdd格式的文件中,并且都在2000之后,文件名中没有20个数字:

例如,X = ['director_send_20140212ds.csv','send20140213abs.csv','mike20140214.csv',....等等]

我想获取仅包含该月第一个日期的文件名的文件名。例如,如果数据从2000年到2017年开始,我只需要一个包含该月第一天的文件名列表(它们是可用的文件)。因此,列表将比可用列表小得多,但仅提供该月第一天的FILENAME。如果有一个文件的月份的第一天是第10天,它将被包括在内,如果没有特定月份的文件名,它将进入下个月。

所以,最终如果有一个每日频率文件名的理想世界,我们将获得特定年份的12个文件名。

2 个答案:

答案 0 :(得分:1)

我相信,不是从文件名中提取日期,而是更容易迭代日期,并匹配相应的文件名:

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

答案 1 :(得分:1)

我这样做:

文件名来源清单:

In [43]: X = ['director_send_20140212ds.csv',
   ....:      'send20140213abs.csv',
   ....:      'mike20140214.csv',
   ....:      'director_send_20140430ds.csv',
   ....:      'send20140402abs.csv',
   ....:      'mike20141214.csv',
   ....: ]

让我们创建一个DF:

In [44]: df = pd.DataFrame({'fn':X})

现在让我们解析文件名之外的日期:

In [45]: df['date'] = pd.to_datetime(df['fn'].str.extract(r'.*(\d{8}).*', expand=False))

现在我们可以轻松找到每月的最短日期

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