1.提取指定行开始的列名
若是出现第一列不是要提取数据的列名时候,可通过header_row参数控制,0即为首行。
def extract_data_to_dataframe(file_path, header_row=0, skip_rows=None):
df = pd.read_excel(file_path, header=header_row, skiprows=skip_rows)
return df
- extract_data_to_dataframe:函数名,表明该函数的作用是从文件中提取数据并转换为 DataFrame。
- file_path:必需参数,代表要读取的 Excel 文件的路径。 header_row:可选参数,默认值为 0,用于指定 Excel
- 文件中哪一行作为 DataFrame 的列名,0 表示第一行,可用于多个列名行。 skip_rows:可选参数,默认值为 None,用于指定在读取文件时要跳过的行数
2.获取指定工作簿的内容
def excel_to_dataframe(file_path: str, sheet_name: str) -> pd.DataFrame:
try:
# 加载工作簿并获取指定工作表
wb = load_workbook(file_path, read_only=True, data_only=True)
sheet = wb[sheet_name]
# 读取表头(第一行)
header = [cell.value for cell in sheet[1]]
# print(header)
# 读取数据(从第二行开始)
data = []
for row in sheet.iter_rows(min_row=2, values_only=True):
data.append(row)
# print(data)
# 创建DataFrame
df = pd.DataFrame(data, columns=header)
return df
except KeyError as e:
print(f"错误:找不到工作表 '{sheet_name}'")
raise
except FileNotFoundError:
print(f"错误:文件 '{file_path}' 不存在")
raise
except Exception as e:
print(f"错误:读取文件时发生异常: {e}")
raise
- excel_to_dataframe:函数名,表明其功能是将 Excel 文件内容转换为 DataFrame。
- file_path:str:必需参数,指定要读取的 Excel 文件路径,类型为字符串。
- sheet_name:str:必需参数,指定要读取的工作表名称,类型为字符串。
- -> pd.DataFrame:函数返回值注解,表示函数会返回一个 pandas.DataFrame 对象。
3.将指定df数据列名下的数据换为年、月、日数据
def extract_year_month_day(df: pd.DataFrame, date_column: str) -> pd.DataFrame:
result_df = df.copy()
# 检查指定的列是否存在
if date_column not in result_df.columns:
raise ValueError(f"指定的列 '{date_column}' 不存在于DataFrame中")
# 尝试将指定列转换为日期时间类型
try:
result_df[date_column] = pd.to_datetime(result_df[date_column])
except (ValueError, TypeError) as e:
raise ValueError(f"无法将列 '{date_column}' 转换为日期时间类型: {str(e)}")
# 提取年、月、日信息并添加为新列
result_df['year'] = result_df[date_column].dt.year
result_df['month'] = result_df[date_column].dt.month
result_df['day'] = result_df[date_column].dt.day
- extract_year_month_day:函数名,表明该函数用于提取年、月、日信息。
- df:pd.DataFrame:必需参数,代表输入的 pandas DataFrame 对象。
- date_column:str:必需参数,指定要从中提取年、月、日信息的日期列名。
- -> pd.DataFrame:函数返回值注解,表示函数会返回一个新的 pandas DataFrame 对象。
4.选出你想要提取的列名
def select_columns_(df, columns):
valid_columns = [col for col in columns if col in df.columns]
df_ = df[valid_columns]
return df_
- select_columns_:函数名,用于从 DataFrame 中选择指定列。
- df:必需参数,代表输入的 pandasDataFrame 对象。
- columns:必需参数,通常是一个包含列名的列表,用于指定要筛选的列。
5.筛选指定列名,指定年、月、日下的数据(见3),需有year,month,day列
def select_columns(df, columns, start_year, start_month, start_day, end_year, end_month, end_day):
start_year = float(start_year)
end_year = float(end_year)
start_month = float(start_month)
end_month = float(end_month)
start_day = float(start_day)
end_day = float(end_day)
valid_columns = [col for col in columns if col in df.columns]
df_ = df[valid_columns]
filtered_df = df_[
((df_['year'] > start_year) |
((df_['year'] == start_year) & (df_['month'] > start_month)) |
((df_['year'] == start_year) & (df_['month'] == start_month) & (df_['day'] >= start_day))) &
((df_['year'] < end_year) |
((df_['year'] == end_year) & (df_['month'] < end_month)) |
((df_['year'] == end_year) & (df_['month'] == end_month) & (df_['day'] <= end_day)))
]
return filtered_df
或者
def select_columns(df, columns, start_year, start_month, start_day, end_year, end_month, end_day):
import datetime
# 转换为整数类型
start_year = int(start_year)
start_month = int(start_month)
start_day = int(start_day)
end_year = int(end_year)
end_month = int(end_month)
end_day = int(end_day)
# 筛选有效列
valid_columns = [col for col in columns if col in df.columns]
df_ = df[valid_columns]
# 创建起始和结束日期对象
start_date = datetime.date(start_year, start_month, start_day)
end_date = datetime.date(end_year, end_month, end_day)
# 将DataFrame中的年、月、日组合成日期对象
df_['date'] = df_.apply(lambda row: datetime.date(int(row['year']), int(row['month']), int(row['day'])), axis=1)
# 过滤日期范围
filtered_df = df_[(df_['date'] >= start_date) & (df_['date'] <= end_date)]
# 删除临时创建的日期列
filtered_df = filtered_df.drop(columns=['date'])
return filtered_df
两者方法均可,作者比较菜,习惯用第一种,哈哈哈哈哈