【问题标题】:How to concatenate/merge two columns in Pandas when one column is datetime and another is object?当一列是日期时间而另一列是对象时,如何在 Pandas 中连接/合并两列?
【发布时间】:2018-05-17 21:53:53
【问题描述】:

我在 Pandas 中有以下数据框:

        Date   Time
0 2017-01-01  00:00
1 2017-01-01  01:00
2 2017-01-01  02:00
3 2017-01-01  03:00
4 2017-01-01  04:00

我想将时间列(类型:对象)连接到日期列(类型:日期时间)(稍后将其名称更改为日期时间)。 Datetime 列中的值应如下所示:

2017-01-01 00:00

连接/合并这些列的最佳方法是什么?结果列类型应为日期时间。谢谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    pd.to_datetimedt.strftime 一起使用

    df['datetime']=pd.to_datetime(df.Date+df.Time,format='%Y-%m-%d%H:%M').dt.strftime('%Y-%m-%d %H:%M')
    
    df
    Out[879]: 
             Date   Time          datetime
    0  2017-01-01  00:00  2017-01-01 00:00
    1  2017-01-01  01:00  2017-01-01 01:00
    2  2017-01-01  02:00  2017-01-01 02:00
    3  2017-01-01  03:00  2017-01-01 03:00
    4  2017-01-01  04:00  2017-01-01 04:00
    

    【讨论】:

    • 我喜欢它,但由于某种原因,这会引发几个回溯和 ValueError: format number 1 of "b'00:00'" is not Recognized,我想知道这是否与 excel 有关我正在使用 pd.read_excel 读取的文件(它是一个 .xlsx)。
    • @KMFR 我也这么认为,如果是 b”00:00” 应该没问题
    【解决方案2】:

    您可以将Date 改为字符串,将其与时间连接,然后转换为日期时间:

    df['Date'] = df['Date'].astype(str)
    
    df['datetime'] = pd.to_datetime(df.Date+' '+df.Time)
    
    >>> df
             Date   Time            datetime
    0  2017-01-01  00:00 2017-01-01 00:00:00
    1  2017-01-01  01:00 2017-01-01 01:00:00
    2  2017-01-01  02:00 2017-01-01 02:00:00
    3  2017-01-01  03:00 2017-01-01 03:00:00
    4  2017-01-01  04:00 2017-01-01 04:00:00
    

    如果您不再需要它们,您可以删除 DateTime

    df.drop(['Date', 'Time'], axis=1, inplace=True)
    

    【讨论】:

    • 我没有投反对票,但在我看来,您可以只使用astype(str),然后使用+ 而不使用apply
    • 谢谢你们!是的,没错,以您的方式连接比应用方法更快...
    【解决方案3】:

    这可能有点粗略,但您可以将它们组合成一个字符串,然后使用pd.to_datetime() 使它们再次日期:

    In [1]: date = pd.to_datetime(pd.Series(['2017-01-01']*5))
    
    In [2]: time = ["0{}:00".format(i) for i in range(5)]
    
    In [3]: df = pd.DataFrame({'date': date, 'time': time})
    
    In [4]: df
    Out[4]:
            date   time
    0 2017-01-01  00:00
    1 2017-01-01  01:00
    2 2017-01-01  02:00
    3 2017-01-01  03:00
    4 2017-01-01  04:00
    
    In [5]: pd.to_datetime((df.date.astype(str) + " " + df.time))
    Out[5]:
    0   2017-01-01 00:00:00
    1   2017-01-01 01:00:00
    2   2017-01-01 02:00:00
    3   2017-01-01 03:00:00
    4   2017-01-01 04:00:00
    dtype: datetime64[ns]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2019-03-01
      • 2015-05-07
      相关资源
      最近更新 更多