使用Pandas将正负整数转换为Timedelta并适配Django DurationField
把Pandas整数列转换为timedelta以适配Django DurationField
没问题,这事儿其实挺直接的,咱们一步步来解决:
首先看你的数据,dep_delay和arr_delay这些正负整数明显代表的是分钟数(航班提前/延误的时长),咱们只需要把这些整数值转换成Pandas的Timedelta类型,就能完美适配Django DurationField支持的datetime.timedelta类型了。
1. 转换整数列为Timedelta
用Pandas自带的pd.to_timedelta()方法就搞定了,指定单位为分钟(unit='m'),正负整数都能被正确处理:
import pandas as pd # 假设你的DataFrame名为df df['dep_delay'] = pd.to_timedelta(df['dep_delay'], unit='m') df['arr_delay'] = pd.to_timedelta(df['arr_delay'], unit='m')
如果你的整数代表的是其他时间单位(比如秒、小时),只需要把unit参数改成对应的s(秒)、h(小时)即可。
2. 存入Django模型
转换后的Pandas Timedelta对象和Python标准库的datetime.timedelta完全兼容,所以你可以直接把这些值赋值给Django模型的DurationField字段,不需要额外做格式转换。比如:
from myapp.models import Flight # 遍历DataFrame批量创建模型实例 for _, row in df.iterrows(): flight = Flight( date=row['date'], dep_time=row['dep_time'], dep_delay=row['dep_delay'], # 直接用转换后的Timedelta值 arr_time=row['arr_time'], arr_delay=row['arr_delay'], cancelled=row['cancelled'], carrier=row['carrier'] ) flight.save()
额外注意点
- 如果你的数据里存在
NaN值,转换后会变成NaT(Not a Time),这时候要确保Django模型的DurationField设置了null=True,否则会报错。你也可以用df['dep_delay'].fillna(pd.Timedelta(0))把空值替换成0时长,或者根据业务需求做其他处理。 - 验证转换结果:可以打印
df['dep_delay'].dtype,如果输出是timedelta64[ns],就说明转换成功了。
内容的提问来源于stack exchange,提问作者Davtho1983
相关产品推荐
相关产品推荐

