如何将pandas列中字符串列表内的datetime转为指定格式字符串?
解决方案
你的time列存储的是字符串形式的datetime对象列表,而非实际的datetime集合,需要先解析字符串得到真实的datetime列表,再逐个格式化。
方法一:简洁实现(适用于可信数据)
利用eval解析字符串为datetime对象列表,再批量格式化:
import pandas as pd import datetime foo = pd.DataFrame({'id': [1,2], 'time' :['[datetime.datetime(2021, 10, 20, 14, 29, 51), datetime.datetime(2021, 10, 20, 14, 46, 8)]', '[datetime.datetime(2021, 10, 20, 15, 0, 44), datetime.datetime(2021, 10, 20, 16, 13, 42)]']}) def format_time_list(time_str): # 解析字符串为datetime列表 dt_list = eval(time_str) # 逐个格式化每个datetime对象 return [dt.strftime('%Y/%m/%d %H:%M:%S') for dt in dt_list] # 生成格式化后的新列 foo['formatted_time'] = foo['time'].apply(format_time_list) print(foo)
执行后输出:
id time formatted_time 0 1 [datetime.datetime(2021, 10, 20, 14, 29, 51), datetime.datetime(2021, 10, 20, 14, 46, 8)] [2021/10/20 14:29:51, 2021/10/20 14:46:08] 1 2 [datetime.datetime(2021, 10, 20, 15, 0, 44), datetime.datetime(2021, 10, 20, 16, 13, 42)] [2021/10/20 15:00:44, 2021/10/20 16:13:42]
方法二:安全实现(适用于不可信数据源)
如果数据来自外部,避免使用eval,改用正则提取datetime参数再构造对象:
import re def safe_format_time_list(time_str): # 匹配datetime的数字参数 pattern = r'datetime\.datetime\((\d+), (\d+), (\d+), (\d+), (\d+), (\d+)\)' matches = re.findall(pattern, time_str) # 构造datetime并格式化 return [datetime.datetime(*map(int, match)).strftime('%Y/%m/%d %H:%M:%S') for match in matches] foo['formatted_time'] = foo['time'].apply(safe_format_time_list)
注意事项
- 方法一代码简洁,但仅适合你能确认字符串无恶意代码的场景。
- 方法二通过正则提取数据,安全性更高,适合处理外部来源的未知数据。
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

