如何在Pandas DataFrame的Date列中查找行号并更新对应数据?
问题描述
我有一个包含Date列和若干Ticker列(如USDCHF、GBPUSD、EURUSD)的DataFrame,需要在Date列中查找指定日期对应的行号,然后更新该行某一Ticker列的整数值。我能获取列号,但不知如何正确获取行号,尝试了多种方法都报错。
相关代码
TestGenMatrix.py
from datetime import datetime, timedelta import pandas as pd df = pd.DataFrame(columns=['Date', 'USDCHF', 'GBPUSD', 'EURUSD']) date = datetime.strptime('2023-01-01', "%Y-%m-%d").date() x = 0 while x < 20: df.loc[x, "Date"] = date date = date + timedelta(days=1) x += 1 print(df) df.to_csv('matrix.csv', encoding='utf-8', index=False)
TestMatrix.py
import pandas as pd from datetime import datetime df = pd.read_csv('matrix.csv', parse_dates=True) date = datetime.strptime('2023-01-10', "%Y-%m-%d").date() print(df.columns) col_index = df.columns.tolist().index('GBPUSD') # Get index of column #row_index = df[df['Date'] == date].index[0] #row_index = df.index.get_loc(date) #row_index = df[df['Date'] == date] row_index = df['Date'] == date print(row_index) df.iloc[row_index, col_index] = 27 # df.loc[row_index, "Date"] = 27 df.to_csv('matrix.csv', encoding='utf-8', index=True)
解决方案
核心问题是日期类型不匹配和行索引获取方式错误,以下是修正后的简洁方案:
1. 关键错误点
- 读取CSV时
parse_dates=True未指定Date列,导致该列未被正确解析为日期类型,和用来匹配的datetime.date对象类型不一致,匹配失败。 - 用
iloc时不能直接传入布尔掩码,需要明确的行索引值。
2. 优雅解决方法
方法一:直接用loc定位更新(推荐)
无需手动获取行列号,直接通过日期条件和列名定位赋值,代码最简洁:
import pandas as pd from datetime import datetime # 读取时明确解析Date列为日期类型 df = pd.read_csv('matrix.csv', parse_dates=['Date']) # 转换为date类型匹配原数据(或直接用datetime对象也可) target_date = datetime.strptime('2023-01-10', "%Y-%m-%d").date() # 直接定位目标行和列赋值 df.loc[df['Date'] == target_date, 'GBPUSD'] = 27 # 保存时不要带索引,避免冗余 df.to_csv('matrix.csv', encoding='utf-8', index=False)
方法二:获取行列号后用iloc更新
如果必须通过行列号操作:
import pandas as pd from datetime import datetime df = pd.read_csv('matrix.csv', parse_dates=['Date']) target_date = datetime.strptime('2023-01-10', "%Y-%m-%d").date() # 获取匹配的行索引(确保日期唯一,取第一个匹配项) row_mask = df['Date'] == target_date if row_mask.any(): row_idx = row_mask.idxmax() # 高效获取列索引 col_idx = df.columns.get_loc('GBPUSD') df.iloc[row_idx, col_idx] = 27 df.to_csv('matrix.csv', encoding='utf-8', index=False)
3. 生成DataFrame的优化(可选)
原生成代码的循环可以简化为更Pythonic的写法:
from datetime import datetime, timedelta import pandas as pd start_date = datetime.strptime('2023-01-01', "%Y-%m-%d").date() # 生成连续20天的日期序列 dates = [start_date + timedelta(days=x) for x in range(20)] # 直接初始化DataFrame df = pd.DataFrame({ 'Date': dates, 'USDCHF': None, 'GBPUSD': None, 'EURUSD': None }) print(df) df.to_csv('matrix.csv', encoding='utf-8', index=False)
内容的提问来源于stack exchange,提问作者StuartM
相关产品推荐
相关产品推荐

