Pandas提取object类型Time字段小时遇TypeError的解决方法
解决pandas中Time字段提取小时的问题
嘿,刚看到你的问题啦~你遇到的TypeError: 'int' object is not subscriptable其实很好理清原因,咱们一步步来解决!
为啥会报错?
你写的循环里:
for row in range (1, len(accidents)): hour = row['Time'].strftime("%H").split(":", 1)[0]
这里的row是整数(从1开始的行号),不是DataFrame的行对象!所以你试图用row['Time']访问列,就会报错——整数可不能用下标访问呀😅。而且更重要的是,pandas处理数据尽量别用循环,效率太低了,咱们用矢量化操作才是正确打开方式!
推荐的解决方法
方法1:直接分割字符串(适合Time是字符串类型的情况)
因为你的Time字段是object类型(也就是字符串),直接按冒号分割取前面的小时部分就行:
# 新增Hour列,提取小时并转成整数 accidents['Hour'] = accidents['Time'].str.split(':', expand=True)[0].astype(int)
解释一下:
str.split(':', expand=True)把每个Time值按冒号拆成两列(小时和分钟)- 取索引为0的列就是小时部分,再用
astype(int)转成整数类型,完美得到你要的结果(比如17:42变成17)
方法2:先转成时间类型(更灵活,适合后续时间操作)
如果之后你还要对时间做筛选、统计之类的操作,建议先把Time列转成datetime类型,再提取小时:
import pandas as pd # 把Time列转成datetime格式(指定格式是小时:分钟) accidents['Time'] = pd.to_datetime(accidents['Time'], format='%H:%M') # 提取小时部分,直接得到整数 accidents['Hour'] = accidents['Time'].dt.hour
这种方法的好处是,之后你可以轻松做比如“统计早高峰(7-9点)的事故数量”这类时间相关分析,非常方便。
如果你非要用循环(不推荐,但新手可以了解)
要是你想试试循环写法,得用iterrows()遍历行对象,而不是行号:
# 先创建一个空的Hour列 accidents['Hour'] = 0 # 遍历每一行的索引和行对象 for idx, row in accidents.iterrows(): # 拆分时间字符串取小时 hour_str = row['Time'].split(':')[0] # 把小时写入对应的行 accidents.loc[idx, 'Hour'] = int(hour_str)
⚠️ 注意:这种方法在数据量大的时候会很慢,尽量用前面两种矢量化方法哦!
内容的提问来源于stack exchange,提问作者user6074035
相关产品推荐
相关产品推荐

