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

Posted

技术标签:

【中文标题】如何使用 Python 仅查找包含该月最后一天的日期的文件?【英文标题】:How can I find only the files that contains date for last day of the month, using Python? 【发布时间】:2021-11-12 07:30:43 【问题描述】:

我有一个包含数百个 .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])

我只有一列中的日期,并且想不通!

任何帮助将不胜感激。

【问题讨论】:

你能有两个不同'ABC DEF'但日期相同的文件吗? no 'ABC DEF' 部分是固定的。只有 DATE 不同。 最后一个值,如果月份表示最后一个日历日,如 31.dec 或每年 dec 月份的最后一个现有日期,每个月的名称类似。 基本上每个月存在的最后一个日期 【参考方案1】:

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

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))

【讨论】:

【参考方案2】:

如果需要每个月和年的最后一行提取日期时间,使用 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

【讨论】:

【参考方案3】:

声明一个函数:

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)]

【讨论】:

我有 SyntaxError: 'return' outside function 现在应该可以工作了

以上是关于如何使用 Python 仅查找包含该月最后一天的日期的文件?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询以查找该月的最后一天

EXCEL问题,怎么用函数或公式取得当月最后一天

返回该月的最后一天

查找给定月份和年份中最后一天的名称

如何使用 mapreduce 和 pyspark 查找某一年某一天的频率

如何从此字符串'opimus_rise_issue_command_201912.txt'中提取该月的最后一天日期