【自用】简单的Python函数——需要分析出指定列,年,月,日的Excel数据。

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
  1. extract_data_to_dataframe:函数名,表明该函数的作用是从文件中提取数据并转换为 DataFrame。
  2. file_path:必需参数,代表要读取的 Excel 文件的路径。 header_row:可选参数,默认值为 0,用于指定 Excel
  3. 文件中哪一行作为 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
  1. excel_to_dataframe:函数名,表明其功能是将 Excel 文件内容转换为 DataFrame。
  2. file_path:str:必需参数,指定要读取的 Excel 文件路径,类型为字符串。
  3. sheet_name:str:必需参数,指定要读取的工作表名称,类型为字符串。
  4. -> 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
  1. extract_year_month_day:函数名,表明该函数用于提取年、月、日信息。
  2. df:pd.DataFrame:必需参数,代表输入的 pandas DataFrame 对象。
  3. date_column:str:必需参数,指定要从中提取年、月、日信息的日期列名。
  4. -> 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_
  1. select_columns_:函数名,用于从 DataFrame 中选择指定列。
  2. df:必需参数,代表输入的 pandasDataFrame 对象。
  3. 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

两者方法均可,作者比较菜,习惯用第一种,哈哈哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值