Python3中如何将Pandas DataFrame的24小时制时间转为12小时制?
解决Pandas中24小时制时间转12小时制的问题
错误原因分析
- 你指定
format="%Y-%m-%d %I:%M:%S %p"时报错,是因为这个格式要求时间字符串必须带AM/PM标识,但你的24小时制数据(比如"2023-07-29 12:32:00")没有这部分内容,格式完全不匹配。 - 你用
df[1]["FORMATTED DATE_TIME--yyyy-MM-dd hh:mm:ss a"].datetime.strptime报错,是因为Pandas的Series对象没有datetime属性,处理时间数据要使用pd.to_datetime()方法或者Series的dt访问器。
正确处理步骤
1. 先统一转换为Pandas datetime类型
不管是12小时制还是24小时制的字符串,先转成Pandas的datetime类型(内部存储格式统一,后续操作更准确),推荐用format='mixed'让Pandas自动推断每条数据的格式:
# 将原时间列转为datetime类型 df["datetime_col"] = pd.to_datetime(df["FORMATTED DATE_TIME--yyyy-MM-dd hh:mm:ss a"], format="mixed")
如果你的数据都是标准ISO8601格式,也可以直接调用pd.to_datetime(df["FORMATTED DATE_TIME--yyyy-MM-dd hh:mm:ss a"]),不用指定格式,Pandas大多能自动识别。
2. 转换为12小时制字符串格式
有了统一的datetime列后,再转成带AM/PM标识的12小时制字符串:
# 生成12小时制格式的时间列 df["12h_formatted_time"] = df["datetime_col"].dt.strftime("%Y-%m-%d %I:%M:%S %p")
%I代表12小时制的小时(01-12)%p代表AM/PM标识(大写,若需要小写可尝试%P,部分系统支持)
3. 合并数据并按周处理
格式统一后,就可以合并两个数据源的DataFrame,再做按周的数据分析或可视化:
# 假设另一个数据源已处理好,名为df2 merged_df = pd.concat([df, df2], ignore_index=True) # 提取周数用于分组 merged_df["week_num"] = merged_df["datetime_col"].dt.isocalendar().week # 按周统计数据(以数据量为例) weekly_stats = merged_df.groupby("week_num").size() # 绘制周数据可视化 import matplotlib.pyplot as plt weekly_stats.plot(kind="bar") plt.xlabel("Week Number") plt.ylabel("Data Volume") plt.show()
性能优化方案(大数据量场景)
如果format="mixed"处理速度慢,可以先拆分12小时制和24小时制数据分别转换,再合并:
# 筛选带AM/PM的12小时制数据 mask_12h = df["FORMATTED DATE_TIME--yyyy-MM-dd hh:mm:ss a"].str.contains("AM|PM", case=False) df_12h = df[mask_12h].copy() df_12h["datetime_col"] = pd.to_datetime(df_12h["FORMATTED DATE_TIME--yyyy-MM-dd hh:mm:ss a"], format="%Y-%m-%d %I:%M:%S %p") # 筛选不带AM/PM的24小时制数据 df_24h = df[~mask_12h].copy() df_24h["datetime_col"] = pd.to_datetime(df_24h["FORMATTED DATE_TIME--yyyy-MM-dd hh:mm:ss a"], format="%Y-%m-%d %H:%M:%S") # 合并处理后的数据集 df = pd.concat([df_12h, df_24h], ignore_index=True)
内容的提问来源于stack exchange,提问作者DataminerPython3
相关产品推荐
相关产品推荐

