CSV日期相关列合并删除方法,Pandas报'无Year属性'错求助
问题解答
一、你的代码报错修复与需求实现
报错原因
报错'Dataframe' object has no attribute 'Year'是因为你将所有列名转为小写后,代码中仍使用大写的Year调用列,Pandas无法匹配到对应列名。此外代码还有几处逻辑错误,以下是修正后的完整代码:
import pandas as pd def airport_data(cur_file, airport_code): # 读取传入路径的CSV文件 airportsearch = pd.read_csv(cur_file) # 筛选出包含目标机场的行(origin或destination为指定机场) airportsearch = airportsearch[ airportsearch['origin_airport'].isin([airport_code]) | airportsearch['destination_airport'].isin([airport_code]) ] # 统一列名为小写 airportsearch.columns = airportsearch.columns.str.lower() # 合并year、month、day为date列 airportsearch['date'] = pd.to_datetime(airportsearch[['year', 'month', 'day']]) # 删除原有的年、月、日列 airportsearch.drop(columns=['day', 'month', 'year'], axis=1, inplace=True) return airportsearch # 调用示例 processed_data = airport_data('/work/Data.airports.csv', 'SFO') print(processed_data.head())
关键修正点
- 匹配列名大小写:转小写后统一使用
year(小写)调用列 - 修正数据筛选:用布尔索引替代错误的
dropna用法,精准筛选目标机场数据 - 正确合并日期:
pd.to_datetime支持直接传入包含年、月、日的DataFrame,自动生成日期类型 - 有效删除原列:添加
inplace=True让删除操作直接作用于原DataFrame,避免数据丢失 - 复用函数参数:使用传入的
cur_file和airport_code,避免硬编码,提升代码灵活性
二、通用需求:合并CSV的date、time、year列为新日期列并删除原列
如果CSV中包含year(年)、date(日/月日)、time(时分秒)三列,可通过以下方式合并为完整的日期时间列:
方法1:直接拼接字符串转日期
import pandas as pd df = pd.read_csv('your_file.csv') # 拼接年、日、时间字符串,转为日期时间类型 df['full_datetime'] = pd.to_datetime( df['year'].astype(str) + '-' + df['date'].astype(str) + ' ' + df['time'] ) # 删除原列 df.drop(columns=['year', 'date', 'time'], axis=1, inplace=True)
方法2:指定列参数(若date为月日格式)
如果date列是MM-DD格式,可直接传入列组合:
df['full_datetime'] = pd.to_datetime({ 'year': df['year'], 'month': df['date'].str.split('-').str[0], 'day': df['date'].str.split('-').str[1], 'hour': df['time'].str.split(':').str[0], 'minute': df['time'].str.split(':').str[1] }) df.drop(columns=['year', 'date', 'time'], axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者mlm.r
相关产品推荐
相关产品推荐

