如何使用 Python 仅查找包含该月最后一天日期的文件?

How can I find only the files that contains date for last day of the month, using Python?

我有一个包含数百个 .xlsx 文件的文件夹,这些文件是多年前的每日数据。

文件名模式是'ABC DEF 20150501.xlsx'

这些年来,我如何从每个月的最后一天选择文件。

遗憾的是我不知道该怎么做。

import pandas as pd
import re

files = [f for f in os.listdir(path) if re.match(r'ABC DEF [0-9]+.xlsx', f)]
df = pd.DataFrame(files)
df.columns = ['file_name']
df['port_date'] = df['file_name'].apply(lambda x : x.split(' ')[3].split('.')[0])

我只得到一栏中的日期,运行 搞不懂!

我们将不胜感激。

如果需要每个月和年的最后一行提取日期时间,使用 GroupBy.last 按年和月排序和分组:

df = pd.DataFrame({'file_name':['ABC DEF 20150501.xlsx',
                                'ABC DEF 20150701.xlsx',
                                'ABC DEF 20150711.xlsx']})

print (df)
               file_name
0  ABC DEF 20150501.xlsx
1  ABC DEF 20150701.xlsx
2  ABC DEF 20150711.xlsx

df['port_date'] = pd.to_datetime(df['file_name'].str.extract('(\d+)\.', expand=False))
df = df.sort_values('port_date')

df = (df.groupby([df['port_date'].dt.year, df['port_date'].dt.month])
        .last()
        .reset_index(drop=True))
print (df)
               file_name  port_date
0  ABC DEF 20150501.xlsx 2015-05-01
1  ABC DEF 20150711.xlsx 2015-07-11

声明一个函数:

def contains_date_of_last_day(name):
  last_days = [
    '0131',
    '0228',
    '0331',
    '0430',
    '0531',
    '0630',
    '0731',
    '0831',
    '0930',
    '1031',
    '1130',
    '1231',
    ]
  for i in last_days:
    if i in name: return True
      return False
    

使用以下函数检查是否包含最后一天的日期:

files = [f for f in os.listdir(path) if contains_date_of_last_day(f)]

以下代码使用了一个函数,将日期添加一天,然后将新日期的月份与原始日期的月份进行比较,如果它们不同,则原始日期是该月的最后一天。

import pandas as pd
from datetime import datetime, timedelta

def last_day(to_date):
    delta = timedelta(days=1)
    next_day = to_date + delta
    if to_date.month != next_day.month:
        return True
    return False

# read dummy filename data
df = pd.read_csv('test.csv')

df['port_date'] = pd.to_datetime(df['file_name'].str[8:16])

df['lastday'] = df['port_date'].apply(lambda dt: last_day(dt))