如何用Pandas处理CSV中不规则时间格式并生成事件时间
解决Pandas处理混杂时间格式并合并列的问题
嘿,这就帮你搞定这个时间数据处理的难题!咱们分两步走:先统一time列的格式,再合并三列生成完整的事件时间。
一、统一time列的格式
你的time列混杂了两种格式:带AM/PM的12小时制时间(如12:00:00 AM),以及日期格式(如1/1/1900)。咱们的目标是把它们统一成24小时制的HH:MM:SS格式,对于日期格式的条目,默认转成00:00:00(代表无具体时间的记录)。
方法1:矢量化操作(高效推荐)
避免循环,直接用Pandas的矢量化处理,速度更快:
import pandas as pd # 读取CSV文件 df = pd.read_csv('your_data.csv') # 标记哪些条目是带AM/PM的时间格式 is_time_format = df['time'].str.contains('AM|PM', na=False) # 处理时间格式条目:转成24小时制字符串 df.loc[is_time_format, 'cleaned_time'] = pd.to_datetime( df.loc[is_time_format, 'time'], format='%I:%M:%S %p' ).dt.time.astype(str) # 处理日期格式条目:转成00:00:00 df.loc[~is_time_format, 'cleaned_time'] = pd.to_datetime( df.loc[~is_time_format, 'time'] ).dt.time.astype(str)
方法2:自定义函数(直观易懂)
如果你更喜欢清晰的逻辑,用apply调用自定义函数更直观:
def standardize_time(time_str): try: # 尝试解析12小时制时间,转成24小时制字符串 return pd.to_datetime(time_str, format='%I:%M:%S %p').strftime('%H:%M:%S') except ValueError: # 解析失败则视为日期,转成00:00:00 return pd.to_datetime(time_str).strftime('%H:%M:%S') df['cleaned_time'] = df['time'].apply(standardize_time)
执行完后,cleaned_time列就统一成了标准的24小时制时间格式。
二、合并三列生成事件时间
根据你的需求,这里提供两种常见的合并逻辑,你可以根据实际场景选择:
场景1:事件时间 = kickoffDate + cleaned_time
如果cleaned_time是事件发生的具体时间,直接用kickoffDate作为日期基础合并:
# 合并日期和标准化后的时间,生成完整datetime df['event_datetime'] = pd.to_datetime(df['kickoffDate'] + ' ' + df['cleaned_time'])
场景2:事件时间 = kickoffDate + kickoffTime(替换时间部分为cleaned_time)
如果kickoffTime是开球时间,而cleaned_time是事件实际发生的时间,替换开球时间的时间部分:
# 先合并kickoffDate和kickoffTime得到开球datetime df['kickoff_datetime'] = pd.to_datetime(df['kickoffDate'] + ' ' + df['kickoffTime']) # 替换时间部分,生成事件时间 df['event_datetime'] = pd.to_datetime( df['kickoff_datetime'].dt.date.astype(str) + ' ' + df['cleaned_time'] )
示例效果
假设你的输入数据是:
| kickoffDate | kickoffTime | time |
|---|---|---|
| 8/6/2017 | 09:00:00 | 12:00:00 AM |
| 8/6/2017 | 09:00:00 | 9:04:00 PM |
| 8/6/2017 | 09:00:00 | 1/1/1900 |
处理后event_datetime列会得到:
2017-08-06 00:00:00 2017-08-06 21:04:00 2017-08-06 00:00:00
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

