含None值的字符串时间列:提取时分值的实现问题求助
嘿,我来帮你搞定这个困扰你的时间处理问题!先回顾下你的场景:你构造了这样一个包含时间字符串和None值的DataFrame:
import pandas as pd import numpy as np d = {'col1': [1,2,3,4,5,6], 'time': ['07:00:00','07:30:00','07:00:00',None,'08:00:00','09:00:00']} data = pd.DataFrame(data=d)
你想要新建一列提取小时和分钟(不含秒),期望输出是['07:00','07:30','07:00',None,'08:00','09:00'](也接受NaT替代None),但之前的两种方法都报错了,我来帮你分析下原因,再给你靠谱的解决方案:
先说说你之前方法失败的原因
第一种方法报错:
AttributeError: 'Series' object has no attribute 'hour'
这是因为你的time列是字符串类型,不是pandas的datetime类型,只有datetime类型的Series才有dt属性和hour属性,直接调用肯定会报错啦。第二种方法报错:
ValueError: unconverted data remains: :00
你用了dt.strptime(x, '%H:%M'),但原字符串是%H:%M:%S格式(带秒数),格式模板和实际字符串不匹配,解析时会剩下:00没法处理,自然就报错了。
靠谱的解决方案来了
我给你两种实用的方法,按需选择:
方法1:先转datetime类型再格式化(严谨通用)
先把字符串转成pandas的datetime类型,然后用strftime格式化出小时和分钟,自动处理None值(会转成NaT,之后可以按需转成None):
# 第一步:将time列转为datetime类型,None会自动变成NaT data['time_dt'] = pd.to_datetime(data['time'], format='%H:%M:%S') # 第二步:格式化提取小时和分钟 data['new_col'] = data['time_dt'].dt.strftime('%H:%M') # 如果想要把NaN转成None(和你期望的输出一致) data['new_col'] = data['new_col'].replace({np.nan: None})
方法2:直接字符串切片(高效简单)
因为你的时间字符串是固定的HH:MM:SS格式,前5个字符正好是HH:MM,所以直接切片就行,代码更简洁:
data['new_col'] = data['time'].apply(lambda x: x[:5] if pd.notna(x) else None)
这两种方法都能得到你想要的结果,方法1适合时间格式可能有变化的场景,方法2适合固定格式的情况,效率更高。
内容的提问来源于stack exchange,提问作者Lysis90

