DataFrame datetime列匹配取值代码失效原因及解决方案求助
问题分析与解决方案
为什么int类型正常,datetime类型失效?
核心原因是**iterrows()返回的row是原DataFrame的副本而非视图**。int版本看似生效是巧合——数值类型的赋值可能触发了隐式的同步,但datetime作为对象类型,修改副本的row['new']不会同步到原DataFrame。datetime本身的等值比较是正常的(你代码里的date_time_date11 == date_time_date23能返回True),问题出在赋值环节,而非比较环节。
修正方案
放弃iterrows()的循环写法,改用pandas原生的向量化操作,高效且可靠:
方法一:map()最简实现
先构建date2到rtn的映射字典,再用date1匹配映射直接赋值:
from datetime import datetime import pandas as pd # 构建测试数据 date_time_date11 = datetime(year=2024, month=10, day=20, hour=1, minute=00, second=00) date_time_date12 = datetime(year=2024, month=10, day=21, hour=13, minute=00, second=00) date_time_date13 = datetime(year=2024, month=10, day=22, hour=1, minute=00, second=00) date_time_date23 = date_time_date11 date_time_date22 = date_time_date12 date_time_date21 = date_time_date13 df = pd.DataFrame({ 'date1': [date_time_date11, date_time_date12, date_time_date13], 'date2': [date_time_date21, date_time_date22, date_time_date23], 'rtn': [21,22,23], 'new': [99,99,99] }) # 构建date2到rtn的映射关系 date2_rtn_map = df.set_index('date2')['rtn'].to_dict() # 用date1匹配映射,赋值给new列 df['new'] = df['date1'].map(date2_rtn_map) print(df)
运行后new列会得到预期的23、22、21。
方法二:merge()适配复杂场景
如果存在一对多匹配或需要保留更多关联列,merge()更灵活:
from datetime import datetime import pandas as pd # 构建测试数据(同方法一) date_time_date11 = datetime(year=2024, month=10, day=20, hour=1, minute=00, second=00) date_time_date12 = datetime(year=2024, month=10, day=21, hour=13, minute=00, second=00) date_time_date13 = datetime(year=2024, month=10, day=22, hour=1, minute=00, second=00) date_time_date23 = date_time_date11 date_time_date22 = date_time_date12 date_time_date21 = date_time_date13 df = pd.DataFrame({ 'date1': [date_time_date11, date_time_date12, date_time_date13], 'date2': [date_time_date21, date_time_date22, date_time_date23], 'rtn': [21,22,23], 'new': [99,99,99] }) # 构建临时映射表 mapping_df = df[['date2', 'rtn']].rename(columns={'date2': 'date_match', 'rtn': 'new'}) # 按date1和date_match匹配合并 df = df.merge(mapping_df, left_on='date1', right_on='date_match', how='left').drop(columns=['date_match']) print(df)
为什么你尝试的转换方法没用?
你尝试的各种datetime格式转换(字符串、序数、时间戳等)都是针对比较环节的,但问题根本不在比较——datetime本身支持直接等值比较,你的代码里df['date1'].isin(df['date2'])也能返回正确结果。问题出在iterrows()的赋值逻辑,所以转换格式无法解决问题。
内容的提问来源于stack exchange,提问作者rtatn8
相关产品推荐
相关产品推荐

