如何用Pythonic高效方法重复DataFrame并逐天递增日期列
高效实现DataFrame重复并逐天递增日期列的方法
我来给你几个高效又Pythonic的解决方案,完美解决你重复DataFrame同时让日期列逐天递增的需求~
首先先确认你的初始DataFrame,以及关键的第一步:必须把日期列c转换成datetime类型,不然没法进行日期递增操作。先把基础代码写出来:
import pandas as pd import numpy as np # 还原你的初始DataFrame data = {'a': ['c1', 'c2', 'c3', 'c4', 'c5'], 'b': ['y', 'n', 'n', 'y', 'y'], 'c': ['2017-10-10']*5} df = pd.DataFrame(data) # 转换日期列为datetime类型(这步必不可少!) df['c'] = pd.to_datetime(df['c'])
接下来给你三种不同的实现方式,按需选择:
方法一:pd.concat + np.repeat 直观易懂
这种方法逻辑清晰,适合刚接触pandas的朋友,容易理解:
n = 3 # 你需要重复的次数 base_date = df['c'].iloc[0] # 生成从基准日期开始的n个连续日期 date_sequence = pd.date_range(base_date, periods=n, freq='D') # 重复原DataFrame n次 result = pd.concat([df]*n, ignore_index=True) # 给日期列批量赋值:每个日期对应原DataFrame的所有行 result['c'] = np.repeat(date_sequence, len(df))
方法二:np.tile 替代pd.concat 性能更优
如果你的DataFrame行数很多或者重复次数n很大,用numpy的tile方法直接提取行,比pd.concat多个DataFrame的性能更好:
n = 3 base_date = df['c'].iloc[0] date_sequence = pd.date_range(base_date, periods=n, freq='D') # 用tile重复原DataFrame的索引,直接取出对应行 result = df.loc[np.tile(df.index, n)].reset_index(drop=True) # 同样批量赋值日期列 result['c'] = np.repeat(date_sequence, len(df))
方法三:assign + explode 一行代码搞定
追求极致简洁的话,这个方法用pandas的assign给每行添加日期列表,再用explode炸开,一行就能完成需求:
n = 3 base_date = df['c'].iloc[0] result = df.assign(c=[pd.date_range(base_date, periods=n, freq='D')]*len(df)).explode('c').reset_index(drop=True)
这些方法都是批量操作,相比你手动复制多个DataFrame再逐个修改日期,不仅代码更简洁,运行效率也高得多,完全符合Pythonic的风格~
内容的提问来源于stack exchange,提问作者Mohamed Thasin ah
相关产品推荐
相关产品推荐

