【问题标题】:Convert number into hours and minutes wile reading CSV in Pandas在 Pandas 中读取 CSV 时将数字转换为小时和分钟
【发布时间】:2021-08-18 20:48:12
【问题描述】:

我有 CSV 文件,其中第二列表示格式为 HHMMSS 的时间点。

ID;TIME
A;110500
B;090000
C;130200

这种情况表明我有一些问题。

  1. pandas 是否有一种数据格式可以用小时、分钟和秒来表示时间点,但没有日、月、...?

  2. 如何将这些字段转换为这种格式?

在 Python 上,我会遍历这些字段。但我确信 Pandas 有更有效的方法。

如果没有没有日期的时间格式,我可以在该时间点添加一个日-月-年日期。

这是一个 MWE

import pandas
import io

csv = io.StringIO('ID;TIME\nA;110500\nB;090000\nC;130200')

df = pandas.read_csv(csv, sep=';')

print(df)

结果

  ID    TIME
0  A  110500
1  B   90000
2  C  130200

但我想看到的是

  ID    TIME
0  A  11:05:00
1  B   9:00:00
2  C  13:02:00

或者更好地减少秒数

  ID    TIME
0  A  11:05
1  B   9:00
2  C  13:02

【问题讨论】:

  • 回答1。是的,它是Timedelta,但它也添加了0 days。另外,我不知道 csv 是否有解析 timedelta 的选项。你可能需要手动解析那个时间。

标签: python-3.x pandas csv time


【解决方案1】:

您可以在read_csv 中使用参数date_parsertime 访问器

df = pandas.read_csv(csv, sep=';', 
                     parse_dates=[1], # need to know the position of the TIME column
                     date_parser=lambda x: pandas.to_datetime(x, format='%H%M%S').time)

print(df)

  ID      TIME
0  A  11:05:00
1  B  09:00:00
2  C  13:02:00

但是读完再做可能也一样好

df = (pandas.read_csv(csv, sep=';')
        .assign(TIME=lambda x: pandas.to_datetime(x['TIME'], format='%H%M%S').dt.time) 
        #or lambda x: pandas.to_datetime(x['TIME'], format='%H%M%S').dt.strftime('%#H:%M')
     )

【讨论】:

  • 如果我需要为多个日期/时间列使用不同的解析器怎么办?
  • @buhtzsaysgetvaccinated 我不认为你可以将解析器列表或字典传递给date_parser,在文档中它没有说你可以,而当你可以传递几个选项时它说其他参数一次在列表或字典中
  • @buhtzsaysgetvaccinated 你也可以考虑使用像df = pd.read_csv(csv, sep=';', converters={'TIME': lambda x: pd.to_datetime(x, format='%H%M%S').time()}) 这样的参数转换器,然后为你想要解析解析器的每一列定义
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多