如何将pandas.Timestamp类型序列与datetime.time类型序列合并?
高效合并pandas日期序列与时间序列的方法
我有一个格式为%Y-%m-%d的pandas.Timestamp类型序列,还有一个包含小时分钟信息的datetime.time类型序列,想要把两者合并成带小时的日期时间序列。示例输入如下:
from pandas import Series, Timestamp, to_datetime import datetime s1 = Series([Timestamp("2021-03-01"),Timestamp("2021-03-01")]) s2 = Series([datetime.time(0,0), datetime.time(0,15)])
目前我是先把两个序列转为字符串拼接,再转换为datetime类型,但觉得这种方法效率较低。请问有没有无需字符串转换的更高效方法?
方法1:datetime.combine结合apply(简单直观)
直接使用datetime.datetime.combine函数将日期对象和时间对象合并,通过apply逐行处理:
import datetime from pandas import Series, Timestamp s1 = Series([Timestamp("2021-03-01"),Timestamp("2021-03-01")]) s2 = Series([datetime.time(0,0), datetime.time(0,15)]) result = s1.combine(s2, lambda date, time: datetime.datetime.combine(date.date(), time))
这种方式实现简单,适合小型数据集,但apply本质是逐行循环,数据量较大时效率有限。
方法2:向量化时间差运算(高效推荐)
将时间序列转换为timedelta类型后,直接与日期序列相加,这是完全向量化的操作,效率远高于字符串拼接或逐行循环:
# 将datetime.time转换为timedelta time_deltas = s2.apply(lambda t: datetime.timedelta(hours=t.hour, minutes=t.minute, seconds=t.second)) # 与Timestamp序列相加得到完整datetime result = s1 + time_deltas
如果要进一步简化,也可以先把时间转为时分秒字符串,再用pd.to_timedelta生成时间差:
import pandas as pd time_strings = s2.apply(lambda t: f"{t.hour}:{t.minute}:{t.second}") time_deltas = pd.to_timedelta(time_strings) result = s1 + time_deltas
这种向量化操作在处理十万级及以上规模的数据时,性能优势非常明显。
方法3:提取组件构造新Timestamp
直接提取Timestamp的年、月、日,结合time的时、分、秒,批量构造新的Timestamp序列:
import pandas as pd result = pd.Series( [pd.Timestamp(year=d.year, month=d.month, day=d.day, hour=t.hour, minute=t.minute, second=t.second) for d, t in zip(s1, s2)] )
该方法可读性较强,同样适合小型数据集,但本质仍是循环构造,大数据量下不如向量化方法高效。
内容的提问来源于stack exchange,提问作者Javier Hernández Martínez
相关产品推荐
相关产品推荐

