此问题类似于我之前提出的问题: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个文件名。
答案 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