Python处理波士顿Hubway骑行数据统计早晚骑行数输出0及报错问题
错误原因排查
1. morning/evening输出为0的原因
- 你通过
open("ExData-trips.csv")得到的trip是文件流对象,首次通过for row in trip遍历完成后,文件指针已经移动到文件末尾,后续执行for time in trip时没有任何内容可以读取,循环不会触发,两个计数变量始终为0。 - 你已经通过列表推导式把转换后的时间存在了
ride_times变量中,但后续计数循环没有使用该变量,反而重复读取空的文件流,逻辑错误。
2. Pandas代码报错的原因
你写的pd.to_datetime(trip['start_date']).dt.hour中,trip是原生文件对象,不是Pandas的DataFrame结构,不支持['列名']的下标取值方式,因此抛出_io.TextIOWrapper对象不可取下标的类型错误。
解决方案
方案一:修正原生Python写法
# 需提前确认你自定义的convert、convert_date函数可正常使用 data = [] # 用with上下文管理器自动管理文件关闭,避免资源泄漏 with open("ExData-trips.csv", "r", encoding="utf-8") as trip: # 读取表头 header = trip.readline().split(",") # 遍历读取所有数据行 for row in trip: row = row.strip().split(",") row = [convert(x) for x in row] data.append(row) # 提取转换后的出发时间 ride_times = [convert_date(row[3]) for row in data] morning = 0 evening = 0 # 遍历已处理好的时间列表计数 for time in ride_times: if time.hour < 12: morning += 1 else: evening += 1 print(morning) print(evening)
方案二:使用Pandas简化实现
import pandas as pd # 读取CSV文件为DataFrame结构 trip_df = pd.read_csv("ExData-trips.csv") # 转换出发时间列格式,提取小时字段 trip_df['start_hour'] = pd.to_datetime(trip_df['start_date']).dt.hour # 分别统计早晚订单量 morning_count = trip_df[trip_df['start_hour'] < 12].shape[0] evening_count = trip_df[trip_df['start_hour'] >= 12].shape[0] print(morning_count) print(evening_count)
内容的提问来源于stack exchange,提问作者jbtrking
相关产品推荐
相关产品推荐

