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

如何在Python Pandas的iterrows()函数中获取前一天日期

解决日期减一天及Pandas行操作问题

一、实现row['DATE_C'] -1天的操作

首先要确保你的DATE_C列是datetime类型(如果是字符串格式,先做转换),然后可以用Pandas的Timedelta工具轻松实现日期减法:

步骤1:转换日期列(若尚未处理)

如果DATE_C是类似'2024-05-20'的字符串,先转成datetime类型,方便后续计算:

import pandas as pd
my_dataframe['DATE_C'] = pd.to_datetime(my_dataframe['DATE_C'])

步骤2:在循环中计算前一天日期

在iterrows循环里,直接对row['DATE_C']减去1天的时间差,再根据SQL需求转成对应格式(比如字符串):

for index, row in my_dataframe.iterrows():
    # 计算前一天的datetime对象
    previous_day = row['DATE_C'] - pd.Timedelta(days=1)
    # 转成SQL需要的字符串格式(比如'YYYY-MM-DD')
    previous_day_str = previous_day.strftime('%Y-%m-%d')
    
    cursor.execute("""
        UPDATE MY_TABLE 
        SET COLUMN1 = %s, COLUMN2 = %s 
        WHERE TO_TIMESTAMP(DATE_COLUMN, 'YYYY-MM-DD') = %s 
          AND COLUMN1 IS NULL
    """, (row['VALUE_A'], row['VALUE_B'], previous_day_str))

如果你的数据库驱动支持直接传入datetime对象(比如PostgreSQL的psycopg2),可以跳过字符串转换,直接传previous_day,这样更安全且避免格式错误:

cursor.execute("""
    UPDATE MY_TABLE 
    SET COLUMN1 = %s, COLUMN2 = %s 
    WHERE DATE_COLUMN = %s 
      AND COLUMN1 IS NULL
""", (row['VALUE_A'], row['VALUE_B'], previous_day))

二、Pandas DataFrame的行操作最佳实践

iterrows虽然直观,但效率较低(每次返回的是Series对象,有额外开销),这里推荐几种更高效的行操作方式:

1. 使用itertuples(比iterrows更快)

itertuples返回命名元组,访问字段的速度明显优于iterrows:

for row in my_dataframe.itertuples(index=False):
    previous_day = row.DATE_C - pd.Timedelta(days=1)
    previous_day_str = previous_day.strftime('%Y-%m-%d')
    
    cursor.execute("""
        UPDATE MY_TABLE 
        SET COLUMN1 = %s, COLUMN2 = %s 
        WHERE TO_TIMESTAMP(DATE_COLUMN, 'YYYY-MM-DD') = %s 
          AND COLUMN1 IS NULL
    """, (row.VALUE_A, row.VALUE_B, previous_day_str))

2. 批量处理+executemany(最高效的数据库操作方式)

避免循环调用cursor.execute,先在DataFrame中处理好所有需要的日期,再批量执行SQL,大幅减少数据库交互次数:

# 先在DataFrame中生成前一天的日期列
my_dataframe['PREVIOUS_DATE'] = my_dataframe['DATE_C'] - pd.Timedelta(days=1)
my_dataframe['PREVIOUS_DATE_STR'] = my_dataframe['PREVIOUS_DATE'].dt.strftime('%Y-%m-%d')

# 准备批量参数列表(提取需要的字段)
params = list(my_dataframe[['VALUE_A', 'VALUE_B', 'PREVIOUS_DATE_STR']].itertuples(index=False, name=None))

# 批量执行更新
cursor.executemany("""
    UPDATE MY_TABLE 
    SET COLUMN1 = %s, COLUMN2 = %s 
    WHERE TO_TIMESTAMP(DATE_COLUMN, 'YYYY-MM-DD') = %s 
      AND COLUMN1 IS NULL
""", params)

3. 使用apply处理复杂行逻辑

如果需要对每行做自定义的复杂计算,可以用apply生成新列,再后续使用:

def get_previous_day(row):
    # 这里可以添加更多自定义逻辑
    return row['DATE_C'] - pd.Timedelta(days=1)

my_dataframe['PREVIOUS_DATE'] = my_dataframe.apply(get_previous_day, axis=1)

内容的提问来源于stack exchange,提问作者user11934987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:22:27