Pandas中Object类型序列无法转换为Datetime,如何提取时间列中的小时部分?
解决从带时区时间列提取小时的问题
我来帮你搞定这个需求!你现在要从格式为2021-04-30 09:32 +0000的时间列里提取小时部分,之前的字符串拆分方法不仅绕路,还因为数据类型问题报错,咱们换一种更可靠的方式来处理:
核心思路:先转成Pandas datetime类型,再直接提取小时
字符串拆分的方法依赖固定格式,一旦时间格式有变化(比如出现秒数)就会出错,而且容易导致数据类型混乱。正确的做法是先把整列时间转成Pandas的datetime类型(包含时区信息),再直接提取小时。
完整步骤代码
假设你的原始DataFrame是df_new,包含time列:
import pandas as pd # 第一步:将原始time列转为带时区的datetime类型 # 格式符说明:%Y-%m-%d是日期,%H:%M是时分,%z是时区偏移(+0000) df_new['time'] = pd.to_datetime(df_new['time'], format='%Y-%m-%d %H:%M %z') # 第二步:提取小时部分 # 方式1:得到整数类型的小时(比如9、1、17) df_new['hour'] = df_new['time'].dt.hour # 方式2:得到两位字符串格式的小时(比如'09'、'01'、'17') # df_new['hour'] = df_new['time'].dt.strftime('%H') # 可选:删除不需要的原始time列 df_new = df_new.drop('time', axis=1)
为什么你之前的方法会报错?
你之前的流程是拆分字符串得到09:32这样的子串,再转成datetime.time对象,但这个列的类型是object(因为每个元素是独立的time对象),而Pandas的.dt方法只适用于datetime64类型的列,所以会提示“不是Datetime格式”。如果非要用你原来的拆分方法补救,可以这样提取小时:
# 基于你原来的拆分结果,提取time对象的hour属性 df_new['hour'] = df_new['hour'].apply(lambda x: x.hour)
但显然,直接转整列datetime的方法更健壮、更简洁。
示例结果
用方式1(整数小时)得到的结果:
hour 0 9 1 1 2 17 3 13 4 11
内容的提问来源于stack exchange,提问作者Ineedhelp_ITaly
相关产品推荐
相关产品推荐

