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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:37