如何在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
相关产品推荐
相关产品推荐

