如何用Pandas/Numpy/Python扁平化去重时间戳列表并格式化
最优方案选择:Pandas/Numpy/原生Python处理嵌套时间戳列表
问题背景
我有一个嵌套的pd.Timestamp类型列表(类型提示:list[list[pd.Timestamp]]),示例代码如下:
import pandas as pd import numpy as np # 嵌套的Pandas时间戳列表示例 input = [[pd.Timestamp('2023-09-01 10:00:00'), pd.Timestamp('2023-09-01 11:00:00')], [pd.Timestamp('2023-09-02 12:00:00'), pd.Timestamp('2023-09-02 13:00:00')], [pd.Timestamp('2023-09-03 14:00:00'), pd.Timestamp('2023-09-03 15:00:00')]] # 调试用的DataFrame转换 input_df = pd.DataFrame(input, columns=['left', 'right'])
需要完成以下操作:
- 扁平化输入列表
- 移除重复的时间戳
- 以矢量化方式对所有元素应用
strftime("%Y/%m/%d/%H")格式
最优方案:Pandas(最快且最优雅)
Pandas在时间序列数据处理上有天然优势,矢量化操作效率高,代码极简:
两种实现方式
# 方式1:直接从原始嵌套列表处理 flat_ts = pd.Series([ts for sublist in input for ts in sublist]) unique_formatted = flat_ts.drop_duplicates().dt.strftime("%Y/%m/%d/%H").tolist() # 方式2:从已有的input_df处理(更简洁) unique_formatted = input_df.stack().drop_duplicates().dt.strftime("%Y/%m/%d/%H").tolist()
核心优势
- 代码简洁:
stack()一键完成扁平化,drop_duplicates()去重,dt.strftime()是原生矢量化时间格式化方法,无需手动循环 - 效率最高:Pandas内部基于C扩展实现,比纯Python循环快数倍,数据量越大优势越明显
- 可读性强:完全贴合时间序列数据的处理习惯,逻辑清晰
Numpy方案
可通过转换为numpy datetime64类型处理,但步骤繁琐:
# 扁平化并转为numpy datetime64数组 flat_np = np.array([ts for sublist in input for ts in sublist], dtype='datetime64[s]') # 去重 unique_np = np.unique(flat_np) # 格式化:需转回Python datetime对象,失去矢量化优势 formatted = [pd.Timestamp(ts).strftime("%Y/%m/%d/%H") for ts in unique_np]
优缺点
- 去重操作
np.unique()效率不错,但格式化环节需要转回Python对象,无法全程矢量化 - 代码比Pandas冗余,缺乏针对时间格式化的原生支持,不够直观
原生Python方案
纯循环处理,仅适合极小数据量:
# 扁平化 flat_py = [ts for sublist in input for ts in sublist] # 去重:用dict.fromkeys保留原始顺序 unique_py = list(dict.fromkeys(flat_py)) # 格式化 formatted_py = [ts.strftime("%Y/%m/%d/%H") for ts in unique_py]
优缺点
- 逻辑直观但代码冗余,循环操作在数据量较大时性能极差
- 无矢量化优化,整体效率远低于前两者
总结
- 大数据量场景:优先选Pandas,兼顾效率与优雅性,完全匹配需求
- 底层数组操作需求:可选Numpy,但时间格式化环节不够便利
- 极小数据量脚本:原生Python可快速实现,但不推荐用于常规业务场景
内容的提问来源于stack exchange,提问作者LucaM
相关产品推荐
相关产品推荐

