如何使用 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))
我有一个包含数百个 .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))