You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:43:19