如何在pd.date_range中使用多组日期批量生成分钟级时间序列
错误原因
- 拼写错误:关键字
lambda被误写为lamda - 逻辑错误:lambda的入参
x是当前行的单个日期值,但代码中传入pd.date_range的是整列df['date'],导致函数接收数组参数而非单个起止时间 - 参数误用:对
df.date这个Series调用apply时不需要指定axis=1,该参数仅用于DataFrame的按行/列迭代场景
正确实现
方案1:apply实现(适合中小数据量)
首先确保date列已转换为datetime类型,再对单个日期值调用pd.date_range:
import pandas as pd import datetime # 先做类型转换,避免非标准格式日期报错 df['date'] = pd.to_datetime(df['date']) # 逐行生成时间序列,结果保存为列表格式的列 df['minute_range'] = df['date'].apply( lambda x: pd.date_range(start=x, end=x+datetime.timedelta(days=1), freq="1min") )
如果需要将生成的时间序列展开为每行一个时间点,追加如下代码:
exploded_df = df.explode('minute_range', ignore_index=True)
方案2:向量化实现(适合超大规模日期数据)
apply本质仍是逐行迭代,日期量级极大时推荐使用完全向量化的实现,性能比apply高1~2个数量级:
import pandas as pd import datetime df['date'] = pd.to_datetime(df['date']) points_per_day = 24 * 60 # 单日1分钟频率共1440个时间点 # 生成基准时间偏移序列 base_offset = pd.timedelta_range(start="0min", end="1439min", freq="1min") # 直接批量生成所有时间点 all_dates = df['date'].repeat(points_per_day).reset_index(drop=True) all_minute_points = all_dates + base_offset.tile(len(df)) # 合并回原DataFrame的其他字段 exploded_df = df.loc[df.index.repeat(points_per_day)].reset_index(drop=True) exploded_df['minute_point'] = all_minute_points
内容的提问来源于stack exchange,提问作者DevangB
相关产品推荐
相关产品推荐

