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

Pandas DataFrame按Time列条件生成Tradedate列的函数失效问题

问题描述

现有包含Date列与Time列的Pandas DataFrame,需要创建Tradedate列:当Time为23:00:00时,将Date加1天;否则直接返回原Date。但编写的trade_date函数未实现预期逻辑,所有行的Tradedate均仅返回初始Date,未按条件执行日期加1操作。

原代码如下:

import pandas as pd
import datetime as dt
df = pd.DataFrame({"Date": ["2021/01/01","2021/01/01","2021/01/02"], "Time": ["22:00:00","23:00:00","00:00:00"]})

df["Date"] = pd.to_datetime(df["Date"])

df.info()

def trade_date(convert):
    
    for x in convert:
        if x == "23:00:00":
            return df["Date"] + pd.DateOffset(days=1)
        else: 
            return df["Date"] 
 
#df["Tradedate"] = df["Time"].apply(trade_date)

df["Tradedate"] = trade_date(df["Time"])
错误原因分析
  • 函数逻辑错误:trade_date接收的是整个Time列(Series对象),进入循环后第一个元素是"22:00:00",直接触发else分支返回整个Date列,后续元素完全没机会被遍历,导致所有行都返回原Date。
  • 调用方式错误:直接传入整个Series而非逐行处理,函数返回的是整列数据,没有实现按行判断的逻辑。
修正方案

方法1:矢量化操作(推荐,效率更高)

利用Pandas的矢量化判断替代循环,避免逐行遍历的性能损耗:

import pandas as pd

df = pd.DataFrame({"Date": ["2021/01/01","2021/01/01","2021/01/02"], "Time": ["22:00:00","23:00:00","00:00:00"]})
df["Date"] = pd.to_datetime(df["Date"])

# 按条件生成Tradedate列
df["Tradedate"] = df["Date"] + pd.DateOffset(days=1).where(df["Time"] == "23:00:00", pd.DateOffset(days=0))

方法2:修复自定义函数并按行应用

如果需要保留自定义函数的思路,需修改函数使其处理单行数据,再通过apply按行调用:

import pandas as pd

df = pd.DataFrame({"Date": ["2021/01/01","2021/01/01","2021/01/02"], "Time": ["22:00:00","23:00:00","00:00:00"]})
df["Date"] = pd.to_datetime(df["Date"])

def trade_date(row):
    if row["Time"] == "23:00:00":
        return row["Date"] + pd.DateOffset(days=1)
    else:
        return row["Date"]

# 按行应用函数
df["Tradedate"] = df.apply(trade_date, axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:22:32