【问题标题】:How to read AM/PM times in pandas?如何在 pandas 中读取 AM/PM 时间?
【发布时间】:2023-03-16 22:40:02
【问题描述】:

我正在处理一个 csv 文件,其中包含一个名为 startTime 的列,其中包含时间。

使用 Excel 打开此文件时,时间在编辑栏中显示为 AM/PM 时间,尽管列中的时间戳显示格式不正确:

startTime
16:02.0
17:45.0
18:57.0
20:23.0

使用 pandas 的 read_csv 读取此文件时,我无法正确格式化这些时间戳:

import pandas as pd
df = pd.read_csv('example_file.csv')
print(df.startTime)

简单地产生:

0        16:02.0 
1        17:45.0 
2        18:57.0 
3        20:23.0

我首先尝试使用pd.to_datetime(df.startTime,format=" %H%M%S") 转换输出系列,但这会产生以下错误消息:

时间数据“16:02.0”与格式“%H%M%S”不匹配(匹配)

然后我尝试了基于 this answerpd.to_datetime(df.startTime,format=" %I:%M:%S %p"),以考虑 AM/PM 约定,但这返回了相同的错误消息。

如何使用 pandas 像 Excel 那样自动格式化这些时间戳?

【问题讨论】:

  • 您能否将您的 csvfile 内容上传为文本而不是图像?
  • 当然,我会更新我的问题并将 csv 文件的内容作为文本包含在内,但我也希望读者可视化 Excel 的公式栏。

标签: python excel pandas parsing timestamp


【解决方案1】:

您的 csv 文件有文本,而不是日期时间,因此您需要先将此列中存储的文本转换为 pandas 日期时间对象,然后您可以通过 strftime 方法将此熊猫日期时间对象转换为您想要的格式:

pd.to_datetime(df['startTime']).dt.strftime(date_format = '%I:%M:%S %p')

输出:

0   04:02:00 PM
1   05:45:00 PM
2   06:57:00 PM
3   08:23:00 PM

注意:这些值是字符串值,而不是日期时间。

针对此特定问题进行编辑:

在转换为午夜 AM 之前将 00h 添加到时间戳的快速格式:

pd.to_datetime(df['startTime'].apply(lambda x: f'00:{x}')).dt.strftime(date_format = '%I:%M:%S %p')

输出:

0   00:16:02 AM
1   00:17:45 AM
2   00:18:57 AM
3   00:20:23 AM

【讨论】:

  • 感谢您的回答。我知道在处理字符串时使用strftime 是有意义的。您的 sn-p 返回以下错误消息 ParserError: hour must be in 0..23: 29:47.0。我会尝试更改date_format 来解决这个问题。
  • 它不会解决问题,您的数据看起来像是在 'Minutes:Seconds.Milliseconds' 中,在这种情况下,您在 Excel 中的时间戳表示必须进行额外的格式/数据转换。
  • @Sheldon 您的分钟值是否超过 59 的任何值? IE。您是否有任何值,其中时间戳的第一部分 >=60(例如 65:02.0)?
  • 不,df['startTime'].max() 返回 '59:59.0'
  • 请注意我做了一些更改(添加 00 而不是 12,因为 12 变成 PM,但你需要有 AM)@Sheldon
【解决方案2】:

试试:

>>> pd.to_datetime(df['startTime'].str.strip(), format='%H:%M.%S')

0   1900-01-01 16:02:00
1   1900-01-01 17:45:00
2   1900-01-01 18:57:00
3   1900-01-01 20:23:00
Name: startTime, dtype: datetime64[ns]

【讨论】:

  • 感谢您的回答,但您的解决方案返回相同的错误消息:ValueError: time data '29:47.0' does not match format '%H:%M.%S' (match)
  • 我正在等待您的数据来修正我的答案。
  • 听起来你在 Excel 中做了一些额外的事情来改变你的价值观@Sheldon,你的时间戳(特别是 16:02.0)代表什么?
  • 我认为你有多余的空间。申请前脱衣to_datetime。我修正了我的答案。
  • 好的。您必须手动解析您的 startTime。
【解决方案3】:

使用 dt.strftime 强制转换为 datetetime 并提取时间

df['startTime']=pd.to_datetime(df['startTime']).dt.strftime('%I:%M.%S%p')

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多