You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何字典转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类型,请问问题出在哪里?


原因与解决方案

问题原因

  1. 函数中通过pd.to_datetime(df.DateTime, format='%Y-%m-%d %H:%M:%S')将DateTime列转换为了Timestamp类型,这是pandas的原生日期时间类型。
  2. groupby后的agg操作提取DateTime列的第一个值时,该值仍为Timestamp类型。
  3. 最后通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:30:29