我正在尝试编写一个函数来简化我的代码,因此我传递了包含列名称的变量。 它适用于 Django 应用程序,调试器不会对我的错误所在提供任何反馈,只是“内部服务器错误”。
我的代码工作正常,不是作为函数编写的:
df_trips['trip_time_prep_starts'] = df_trips["trip_time_prep_starts"].map(str)
df_trips.trip_time_prep_starts = pd.to_datetime(df_trips.trip_time_prep_starts)
df_trips['trip_time_left_house'] = df_trips['trip_time_left_house'].map(str)
df_trips.trip_time_left_house = pd.to_datetime(df_trips.trip_time_left_house)
df_trips['stage1_duration']=(df_trips['trip_time_left_house']-df_trips['trip_time_prep_starts']).dt.total_seconds()
作为函数编写,传递以下变量:
stage_name="stage1_duration"
stage_start="trip_time_prep_starts"
stage_end="trip_time_left_house"
我的函数:
def calc_stage_duration(df_trips, stage_name, stage_start, stage_end):
df_trips[stage_start] = df_trips[stage_start].map(str)
df_trips.[stage_start] = pd.to_datetime(df_trips.[stage_start])
df_trips[stage_end] = df_trips[stage_end].map(str)
df_trips.[stage_end] = pd.to_datetime(df_trips.[stage_end])
df_trips[stage_name]=(df_trips[stage_end]-df_trips[stage_start]).dt.total_seconds()
我找不到我的错误,我不清楚括号和句点的正确使用,例如 df_trip.[stage_end] 与 df_trips[stage_end]
你的代码中的问题在于你使用了
df_trips.[column_name]
,这是错误的语法。 要访问 Pandas DataFrame 的列,你应该使用
df_trips[column_name]
。
以下是你的函数的更正版本:
def calc_stage_duration(df_trips, stage_name, stage_start, stage_end):
df_trips[stage_start] = df_trips[stage_start].astype(str)
df_trips[stage_start] = pd.to_datetime(df_trips[stage_start])
df_trips[stage_end] = df_trips[stage_end].astype(str)
df_trips[stage_end] = pd.to_datetime(df_trips[stage_end])
df_trips[stage_name] = (df_trips[stage_end] - df_trips[stage_start]).dt.total_seconds()
return df_trips
在此更正中:
-
我们使用
df_trips[column_name]
来访问和修改 DataFrame 的列。 -
我们使用
.astype(str)
代替.map(str)
来将列转换为字符串,因为它通常更有效。 - 我们将修改后的 DataFrame 返回,以便函数调用者可以访问更新后的数据。
以下是如何使用此函数的示例:
stage_name = "stage1_duration"
stage_start = "trip_time_prep_starts"
stage_end = "trip_time_left_house"
df_trips = calc_stage_duration(df_trips, stage_name, stage_start, stage_end)
现在,此函数应按预期计算阶段持续时间并将其存储在指定列中。
标签:python,django,pandas,dataframe From: 78814139