如何修改DataFrame混合类型列的日期时间格式(保留字符串)
解决DataFrame混合类型列的时间格式化问题
问题说明
我的DataFrame中Start Shift列同时存在datetime和字符串两种数据类型,需要将该列的datetime值转换为HH:MM AM/PM格式的时间字符串,同时保留原字符串内容不变。但尝试的代码未生效,DataFrame没有任何变化。
用户使用的错误代码
df=pd.read_excel(r"C:\Users\Mahmoud.Bader\Desktop\FP Attendance V1.6 Apr 22.xlsx","Attendance").fillna("") for i in df['Start Shift']: try: if i.isalpha(): i except: i.strftime('%H:%M %p')
原DataFrame示例
| Department | Start Shift |
|---|---|
| Accommodation | Annual |
| Accommodation | OFF Day |
| Accommodation | 2022-04-01 12:00:00 |
| Accommodation | 2022-04-01 09:00:00 |
| Accommodation | 2022-04-01 10:00:00 |
| Complaints | OFF Day |
| Complaints | 2022-04-29 07:00:00 |
| Complaints | 2022-04-29 08:00:00 |
| Complaints | 2022-04-30 07:00:00 |
| Complaints | 2022-04-30 08:00:00 |
期望结果
| Department | Start Shift |
|---|---|
| Accommodation | Annual |
| Accommodation | OFF Day |
| Accommodation | 12:00 PM |
| Accommodation | 09:00 AM |
| Accommodation | 10:00 AM |
| Complaints | OFF Day |
| Complaints | 07:00 AM |
| Complaints | 08:00 AM |
| Complaints | 07:00 AM |
| Complaints | 08:00 AM |
错误原因分析
- 遍历
df['Start Shift']时,i是元素的副本,修改i不会同步到原DataFrame中。 - 异常处理逻辑错误:datetime对象没有
isalpha()方法,会直接触发异常,但处理后的值没有赋值回DataFrame。 OFF Day包含空格,isalpha()会返回False,导致该字符串被错误地代入异常处理逻辑,触发新的错误。
正确解决方案
使用apply函数逐元素处理,判断类型后格式化时间并赋值回原列:
方法1:自定义函数处理
import pandas as pd # 读取数据 df = pd.read_excel(r"C:\Users\Mahmoud.Bader\Desktop\FP Attendance V1.6 Apr 22.xlsx", "Attendance").fillna("") def format_shift_value(val): # 判断是否为datetime类型 if isinstance(val, pd.Timestamp): # 转换为12小时制时间格式 return val.strftime('%I:%M %p') # 字符串类型直接返回 return val # 应用处理函数到目标列 df['Start Shift'] = df['Start Shift'].apply(format_shift_value)
方法2:lambda表达式简化
import pandas as pd df = pd.read_excel(r"C:\Users\Mahmoud.Bader\Desktop\FP Attendance V1.6 Apr 22.xlsx", "Attendance").fillna("") df['Start Shift'] = df['Start Shift'].apply( lambda x: x.strftime('%I:%M %p') if isinstance(x, pd.Timestamp) else x )
说明
%I用于12小时制时间格式(01-12),如果需要24小时制可以替换为%H。apply函数会遍历列中每个元素,处理后返回新的序列,赋值回原列即可完成修改。
内容的提问来源于stack exchange,提问作者Mahmoud Badr
相关产品推荐
相关产品推荐

