如何在Pandas中替换Timestamp的时分?报错求助
解决Pandas修改Datetime列时分秒的报错问题
嘿,我懂你遇到的这个坑!你用replace()的时候犯了个常见的小错误——Pandas里单个Datetime对象的replace()只能接受单个标量值(比如整数20),但你传入的是整列数据(data['t_hour']是Series对象),所以才会抛出TypeError: replace() got an unexpected keyword argument 'hour'这个错误。
下面给你三种可行的解决方案,按需挑选:
方法1:用apply()逐行处理(简单直观)
这种方法适合小数据集,逻辑清晰,容易理解:
import pandas as pd # 构造示例数据 data = pd.DataFrame({ 'some_time': ['2020-09-01 19:00:58.0000', '2020-10-31 14:44:00.0000'], 't_hour': [20, 17], 't_min': [0, 45] }) # 先将some_time转为datetime类型(如果还没转的话) data['some_time'] = pd.to_datetime(data['some_time']) # 生成target_time列 data['target_time'] = data.apply( lambda row: row['some_time'].replace( hour=row['t_hour'], minute=row['t_min'], second=0 ), axis=1 )
运行后就能得到你想要的结果:
| some_time | t_hour | t_min | target_time | |
|---|---|---|---|---|
| 0 | 2020-09-01 19:00:58 | 20 | 0 | 2020-09-01 20:00:00 |
| 1 | 2020-10-31 14:44:00 | 17 | 45 | 2020-10-31 17:45:00 |
方法2:拼接日期字符串再转datetime(灵活可控)
如果你习惯用字符串操作,可以提取原时间的日期部分,再和t_hour、t_min组合成新的时间字符串:
data['target_time'] = pd.to_datetime( # 提取原时间的日期部分转为字符串 data['some_time'].dt.date.astype(str) + ' ' + # 小时补零确保两位格式 data['t_hour'].astype(str).str.zfill(2) + ':' + # 分钟补零确保两位格式 data['t_min'].astype(str).str.zfill(2) + ':00' )
这里的str.zfill(2)很关键,能避免出现2020-09-01 9:5:00这种格式错误的时间,保证小时和分钟都是两位数字。
方法3:向量化操作(高效适配大数据集)
如果你的数据集很大,apply()逐行处理会比较慢,推荐用向量化的时间运算:
# 提取原时间的日期部分(去掉时分秒) date_part = data['some_time'].dt.floor('D') # 将t_hour和t_min转为时间差对象 time_delta = pd.to_timedelta( data['t_hour'].astype(str) + ':' + data['t_min'].astype(str) + ':00' ) # 日期加时间差得到目标时间 data['target_time'] = date_part + time_delta
这种方法完全是向量化操作,速度比apply()快数倍,处理百万级数据也能轻松应对。
内容的提问来源于stack exchange,提问作者rkraft
相关产品推荐
相关产品推荐

