Pandas DataFrame用strftime格式化时间失败,仍显示纳秒
Pandas 提取时间并格式化到秒的问题解决
问题描述
现有如下格式的Pandas DataFrame:
0 1 2 3 0 2010-02-12/08:14:24.280000 0.12 0.45 0.66 1 2010-02-12/08:15:24.333000 0.14 0.55 0.77
需要新增列4,提取列0中的时间数据并格式化为仅保留到秒的格式(%H:%M:%S),预期效果如下:
0 1 2 3 4 0 2010-02-12/08:14:24.280000 0.12 0.45 0.66 08:14:24 1 2010-02-12/08:15:25.333000 0.14 0.55 0.77 08:15:25
尝试了以下代码,但列4仍然显示纳秒格式:
import pandas as pd df = pd.read_csv('/home/efw_20100213.csv', header=None) df[0] = pd.to_datetime(df[0]) df[4] = df[0] df[4].apply(lambda x: x.strftime("%H:%M:%S"))
解决方法
问题核心是没有将格式化后的结果赋值回列4,同时推荐使用Pandas原生的向量化方法替代apply,效率更高。
正确代码
import pandas as pd df = pd.read_csv('/home/efw_20100213.csv', header=None) # 将列0转换为datetime类型 df[0] = pd.to_datetime(df[0]) # 直接对datetime列使用dt.strftime格式化,赋值给列4 df[4] = df[0].dt.strftime("%H:%M:%S")
代码解释
pd.to_datetime(df[0]):把列0的字符串时间转成Pandas的datetime类型,为后续格式化做准备。df[0].dt.strftime("%H:%M:%S"):通过dt访问器对整个Series做向量化格式化,直接生成仅含时分秒的字符串,比apply的循环操作效率高很多。- 将格式化结果赋值给
df[4],此时列4是字符串类型,不会显示纳秒信息。
若坚持使用apply的写法
如果一定要用apply,必须把结果赋值回列4:
import pandas as pd df = pd.read_csv('/home/efw_20100213.csv', header=None) df[0] = pd.to_datetime(df[0]) df[4] = df[0].apply(lambda x: x.strftime("%H:%M:%S"))
(注:此方法处理大数据量时效率较低,不推荐)
验证结果
执行正确代码后,DataFrame将符合预期格式:
0 1 2 3 4 0 2010-02-12/08:14:24.280000 0.12 0.45 0.66 08:14:24 1 2010-02-12/08:15:24.333000 0.14 0.55 0.77 08:15:24
内容的提问来源于stack exchange,提问作者user21064805
相关产品推荐
相关产品推荐

