如何将Pandas数据框指定日期列转换为含datetime的字典列表
问题:将Pandas Timestamp转换为Python datetime类型的字典列表
给定包含「Start date」和「End date」的CSV数据:
Start date End date 10/1/2017 15:23:25 10/1/2017 15:26:26 10/1/2017 15:42:57 10/1/2017 17:49:59
需要转换为包含Python标准库datetime.datetime对象的字典列表:
[{'start': datetime.datetime(2017, 10, 1, 15, 23, 25), 'end': datetime.datetime(2017, 10, 1, 15, 26, 26)}, {'start': datetime.datetime(2017, 10, 1, 15, 42, 57), 'end': datetime.datetime(2017, 10, 1, 17, 49, 59)}]
现有代码生成的是Pandas的Timestamp类型,不符合需求:
import pandas as pd # Create a Pandas DataFrame df = pd.DataFrame({'Start Date': ['10/1/2017 15:23:25', '10/1/2017 15:42:57'], 'End Date': ['10/1/2017 15:26:26', '10/1/2017 17:49:59']}) # Create a list of dictionaries list_of_dicts = [] # Loop over the DataFrame rows for index, row in df.iterrows(): # Create a dictionary dict_ = {'start': pd.to_datetime(row['Start Date']), 'end': pd.to_datetime(row['End Date'])} # Append the dictionary to the list list_of_dicts.append(dict_) # Print the list of dictionaries print(list_of_dicts)
输出结果:
[{'start': Timestamp('2017-10-01 15:23:25'), 'end': Timestamp('2017-10-01 15:26:26')}, {'start': Timestamp('2017-10-01 15:42:57'), 'end': Timestamp('2017-10-01 17:49:59')}]
解决方案
Pandas的Timestamp对象自带.to_pydatetime()方法,可直接转换为Python标准库的datetime.datetime对象,以下是几种实现方式:
方法1:循环内直接转换
修改原有循环的字典生成逻辑,对每个Timestamp调用转换方法:
import pandas as pd import datetime df = pd.DataFrame({'Start Date': ['10/1/2017 15:23:25', '10/1/2017 15:42:57'], 'End Date': ['10/1/2017 15:26:26', '10/1/2017 17:49:59']}) list_of_dicts = [] for index, row in df.iterrows(): dict_ = { 'start': pd.to_datetime(row['Start Date']).to_pydatetime(), 'end': pd.to_datetime(row['End Date']).to_pydatetime() } list_of_dicts.append(dict_) print(list_of_dicts) # 验证类型:print(type(list_of_dicts[0]['start'])) # 输出 <class 'datetime.datetime'>
方法2:批量转换列后生成字典列表
先批量转换日期列,再用to_dict('records')生成目标列表,效率优于逐行循环:
import pandas as pd df = pd.DataFrame({'Start Date': ['10/1/2017 15:23:25', '10/1/2017 15:42:57'], 'End Date': ['10/1/2017 15:26:26', '10/1/2017 17:49:59']}) # 批量转换列并调整列名 df['start'] = pd.to_datetime(df['Start Date']).dt.to_pydatetime() df['end'] = pd.to_datetime(df['End Date']).dt.to_pydatetime() # 生成目标字典列表 list_of_dicts = df[['start', 'end']].to_dict('records') print(list_of_dicts)
方法3:用apply函数逐行处理
通过apply函数对每行做转换,直接生成字典列表:
import pandas as pd df = pd.DataFrame({'Start Date': ['10/1/2017 15:23:25', '10/1/2017 15:42:57'], 'End Date': ['10/1/2017 15:26:26', '10/1/2017 17:49:59']}) list_of_dicts = df.apply( lambda row: { 'start': pd.to_datetime(row['Start Date']).to_pydatetime(), 'end': pd.to_datetime(row['End Date']).to_pydatetime() }, axis=1 ).tolist() print(list_of_dicts)
所有方法均可输出符合要求的、包含datetime.datetime对象的字典列表。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

