【问题标题】:How to combine one Pandas dataframe column with a date and another with a time?如何将一个 Pandas 数据框列与日期和另一个与时间相结合?
【发布时间】:2019-01-15 19:13:05
【问题描述】:

我正在使用包含两列的 CSV,一列的日期为月/日/年格式(例如 2019 年 1 月 15 日),另一列的时间格式为 12 小时制“a”代表 AM,“p”代表 PM。示例:10/9/2017,9:50a 和 10/9/2017,3:50p。我想将这两列合并为一列 DateTime 对象,例如“2017-10-09 09:50:00”和“2017-10-09 15:50:00”。

这些恰好位于 CSV 的第 2 列和第 3 列中。我用pd.read_csv 尝试了以下选项:

  • 通过parse_dates = True:似乎没有发生任何事情。根据dtypes,生成的日期和时间列只是“对象”,而不是 DateTime 对象。
  • 传递parse_dates = [[2,3]]:合并列但不会生成 DateTime 对象。
  • 传递parse_dates = [2,3]:将各个列转换为 DateTime 对象,但不合并;日期列已正确转换,但时间列最后附有 今天的日期,例如2019-01-15 15:50:00

我也尝试过date_parser,但我不确定我需要给它什么解析功能——看起来熊猫应该能够处理这些日期/时间格式而无需强制。

有什么想法吗?提前致谢。

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    您可以在将数据读入数据框后转换为datetime。由于您的 datetime 组件分为 2 个系列,因此尝试直接使用 pd.read_csv 进行解析可能会很困难。

    from io import StringIO
    
    x = """date,time
    10/9/2017,9:50a
    10/9/2017,3:50p"""
    
    # replace StringIO(x) with 'file.csv'
    df = pd.read_csv(StringIO(x))
    
    df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'])
    
    print(df)
    #         date   time            datetime
    # 0  10/9/2017  9:50a 2017-10-09 09:50:00
    # 1  10/9/2017  3:50p 2017-10-09 15:50:00
    

    【讨论】:

    • 谢谢!用稍微不同的配方尝试了这个,这很有效。
    【解决方案2】:

    我想通了,就在@jpp 发布他们的解决方案并使用了这样的东西之后:

    df = pd.read_csv("rawdata.csv", parse_dates={"Combined": [2,3]})
    df['Combined'] = pd.to_datetime(df['Combined'], errors="coerce")
    

    最后一个参数是因为我的数据中有 NaN。基本上:就像其他答案所说,先组合列,然后使用to_datetime 进行更改。再次感谢。

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2020-09-13
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2023-02-13
      • 2017-05-16
      相关资源
      最近更新 更多