为何字典转DataFrame后结果键变为Timestamp类型?
问题:日期字典转换后键变为Timestamp类型,如何保持原字符串格式?
我有一个以日期字符串为键、数值为值的字典(示例如下):
{'2022-09-18 06:00:00': 5.4, '2022-09-18 07:00:00': 6.0, '2022-09-18 08:00:00': 6.5, '2022-09-18 14:00:00': 7.9, '2022-09-18 15:00:00': 7.8, '2022-09-18 16:00:00': 7.6, '2022-09-18 17:00:00': 6.8, '2022-09-18 18:00:00': 6.4, '2022-09-18 19:00:00': 5.7, '2022-09-18 20:00:00': 4.8, '2022-09-18 21:00:00': 5.4, '2022-09-18 22:00:00': 4.7, '2022-09-18 23:00:00': 4.3, '2022-09-19 04:00:00': 3.5, '2022-09-19 05:00:00': 2.8, '2022-09-19 06:00:00': 3.8}
使用以下Python函数将其转换为DataFrame并处理:
def dict_to_df(date_dict): df = pd.DataFrame(list(date_value.items()), columns=['DateTime', 'Value']) df['DateTime'] = pd.to_datetime(df.DateTime, format='%Y-%m-%d %H:%M:%S') df['Date'] = df['DateTime'].dt.strftime('%d/%m/%Y') df['Time'] = df['DateTime'].dt.strftime('%H:%M') df['period'] = pd.cut(pd.to_datetime(df.DateTime).dt.hour, bins=[0, 5, 17, 23], labels=['night', 'morning', 'night'], include_lowest=True, ordered= False) df['DatePeriod']=df['Date'].astype(str) + '-' + df['period'].astype(str) result_df = (df.groupby('DatePeriod') .agg({"Value": list, ("DateTime"): "first"}) .set_index("DateTime")["Value"] .to_dict()) return result_df
但转换后得到的结果中,键变为了Timestamp类型:
{Timestamp('2022-09-18 06:00:00'): [5.4, 6.0, 6.5, 6.7, 6.9, 7.9, 8.5, 7.5, 7.9, 7.8, 6.8], Timestamp('2022-09-18 18:00:00'): [6.4, 5.7, 4.8, 5.4, 4.7, 4.3], Timestamp('2022-09-19 06:00:00'): [3.8], Timestamp('2022-09-19 00:00:00'): [4.1, 4.4, 4.3, 3.8, 3.5, 2.8]}
我希望结果的键保持原日期字符串格式,不清楚为何会变成Timestamp类型,请问问题出在哪里?
原因与解决方案
问题原因
- 函数中通过
pd.to_datetime(df.DateTime, format='%Y-%m-%d %H:%M:%S')将DateTime列转换为了Timestamp类型,这是pandas的原生日期时间类型。 groupby后的agg操作提取DateTime列的第一个值时,该值仍为Timestamp类型。- 最后通过
set_index("DateTime")将Timestamp列设为索引,调用to_dict()时,索引直接作为字典的键,因此最终键是Timestamp类型。
解决方案
只需在聚合DateTime时,将其转换回原格式的字符串即可。修改agg中的DateTime处理逻辑,同时修正原函数的笔误(date_value应为传入的参数date_dict):
修改后的完整函数:
import pandas as pd def dict_to_df(date_dict): df = pd.DataFrame(list(date_dict.items()), columns=['DateTime', 'Value']) df['DateTime'] = pd.to_datetime(df.DateTime, format='%Y-%m-%d %H:%M:%S') df['Date'] = df['DateTime'].dt.strftime('%d/%m/%Y') df['Time'] = df['DateTime'].dt.strftime('%H:%M') df['period'] = pd.cut(df['DateTime'].dt.hour, bins=[0, 5, 17, 23], labels=['night', 'morning', 'night'], include_lowest=True, ordered= False) df['DatePeriod']=df['Date'].astype(str) + '-' + df['period'].astype(str) result_df = (df.groupby('DatePeriod') .agg({ "Value": list, "DateTime": lambda x: x.dt.strftime('%Y-%m-%d %H:%M:%S').iloc[0] }) .set_index("DateTime")["Value"] .to_dict()) return result_df
运行修改后的函数,得到的字典键会保持YYYY-MM-DD HH:MM:SS的字符串格式。
内容的提问来源于stack exchange,提问作者Lana.s
相关产品推荐
相关产品推荐

