Python循环处理二进制转日期大数据的性能优化方案
你原有代码运行速度极慢的核心原因有两个:
- 循环内反复调用
pd.concat拼接DataFrame,每次拼接都会全量复制已有结果,时间复杂度为O(n²),行数量级越高速度衰减越明显 - 每行都重复生成365天的日期序列,存在大量冗余计算
优化方案
直接使用Pandas内置的向量化展开操作替代显式Python循环,15000行的场景可以在秒级完成运算:
import pandas as pd # 起始日期按需调整,你需求里写的是2020-12-13,原代码写的是2021-12-13请注意对齐 start_date = '2020-12-13' # 预先生成一次全量日期序列,避免重复计算 fixed_dates = pd.date_range(start_date, periods=365, freq='D') # 1. 将二进制字符串拆分为单字符列表 df['Code'] = df['binairy'].apply(list) # 2. 按二进制位展开行,每一位对应单独一行 expanded_df = df.explode('Code', ignore_index=True) # 3. 给每一行匹配对应日期:每组ID/Nature对应365个固定日期 expanded_df['Date'] = pd.np.tile(fixed_dates, len(df)) # 4. 提取需要的字段并对齐列名 result = expanded_df[['id', 'Nature', 'Date', 'Code']].rename(columns={'id': 'ID'})
如果你的二进制字符串长度不都是365位,可以用下面的适配版本:
import pandas as pd start_date = pd.to_datetime('2020-12-13') # 拆分二进制并展开 expanded_df = df.assign(Code=df['binairy'].apply(list)).explode('Code', ignore_index=True) # 按原行分组计算偏移天数,生成对应日期 expanded_df['Date'] = start_date + expanded_df.groupby(level=0).cumcount().apply(lambda x: pd.Timedelta(days=x)) # 对齐输出列 result = expanded_df[['id', 'Nature', 'Date', 'Code']].rename(columns={'id': 'ID'})
内容的提问来源于stack exchange,提问作者Cherry cherry
相关产品推荐
相关产品推荐

