Python做鸟类迁徙追踪项目时创建deltatime数组报KeyError:0如何解决
报错原因
你触发KeyError: 0的核心原因是:
通过times = birdData.timestamps[birdData.bird_name == name]拿到的times是pandas Series类型,它的索引继承自原birdData数据集的行索引,不是从0开始的连续整数索引。你用[0]访问时,pandas会查找索引值为0的行,而非序列的第一个元素,除第一只鸟外其他鸟对应的数据段没有索引为0的行,就会触发报错。
另外你开头导入的from pandas._libs.tslibs import timestamps属于冗余代码,还和后续自定义的timestamps变量重名,建议直接删除。
解决方法
方法1:最小改动现有代码
只需要修改取初始时间的写法,用iloc按位置取第一个元素即可:
x = time - times.iloc[0]
方法2:优化写法(无需嵌套循环,运行效率更高)
pandas支持时间差批量计算,可以直接简化代码如下:
import pandas as pd import matplotlib.pyplot as plt import datetime import numpy as np birdData = pd.read_csv("bird_tracking.csv") # 直接批量转换时间格式,无需手动循环处理 birdData["timestamps"] = pd.to_datetime(birdData["date_time"].str[:-3], format="%Y-%m-%d %H:%M:%S") plt.figure(figsize=(7, 7)) for name in pd.unique(birdData.bird_name): single_bird = birdData[birdData.bird_name == name] # 批量计算经过天数 elapsed_days = (single_bird["timestamps"] - single_bird["timestamps"].iloc[0]).dt.total_seconds() / 86400 plt.plot(elapsed_days, label = name) plt.xlabel("观测序号") plt.ylabel("经过时间(天)") plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者SarahLMelo
相关产品推荐
相关产品推荐

