如何从存储多日期值的DataFrame创建字典?
保留日期格式的DataFrame分组转字典方法
原始DataFrame定义
import pandas as pd df = pd.DataFrame( columns=["key", "timestamp_1", "timestamp_2"], data=[ (1, pd.to_datetime("2012-07-16 23:23:50"), pd.to_datetime("2012-07-18 23:23:50")), (2, pd.to_datetime("2012-08-16 02:23:50"), pd.to_datetime("2012-09-16 02:23:50")), (3, pd.to_datetime("2015-07-16 12:23:50"), pd.to_datetime("2015-08-16 12:23:50")), (4, pd.to_datetime("2018-08-16 20:23:50"), pd.to_datetime("2018-09-16 20:23:50")), ], )
问题场景
执行以下代码后,输出结构符合要求,但日期被转为纳秒级时间戳数值,丢失了原日期格式:
df.groupby('key')['timestamp_1', 'timestamp_2'].apply(lambda x: x.values.tolist()).to_dict() # 输出结果 {1: [[1342481030000000000, 1342653830000000000]], 2: [[1345083830000000000, 1347762230000000000]], 3: [[1437049430000000000, 1439727830000000000]], 4: [[1534451030000000000, 1537129430000000000]]}
解决方案
方法1:转为默认字符串格式
将日期列转为字符串后再生成列表,保留原显示格式:
result = df.groupby('key')[['timestamp_1', 'timestamp_2']].apply( lambda x: x.astype(str).values.tolist() ).to_dict() # 输出示例 # {1: [['2012-07-16 23:23:50', '2012-07-18 23:23:50']], # 2: [['2012-08-16 02:23:50', '2012-09-16 02:23:50']], # ...}
方法2:自定义日期字符串格式
用dt.strftime指定想要的日期格式,比如%Y-%m-%d %H:%M:%S:
result = df.groupby('key')[['timestamp_1', 'timestamp_2']].apply( lambda x: x.apply(lambda y: y.strftime('%Y-%m-%d %H:%M:%S')).values.tolist() ).to_dict()
方法3:保留Python原生datetime对象
如果需要后续继续处理日期逻辑,可以转为Python原生的datetime对象:
result = df.groupby('key')[['timestamp_1', 'timestamp_2']].apply( lambda x: x.apply(lambda y: y.to_pydatetime()).values.tolist() ).to_dict()
原因说明
原代码中x.values会将pandas的Timestamp对象转为numpy的datetime64类型,调用tolist()时会自动转换为纳秒级整数时间戳。通过先转换为字符串或原生datetime对象,即可避免这种转换,保留日期格式。
内容的提问来源于stack exchange,提问作者cwohlfart
相关产品推荐
相关产品推荐

