代码之家  ›  专栏  ›  技术社区  ›  svn

将pandas-df[datetime]时间和日期列合并为一个日期时间列

  •  1
  • svn  · 技术社区  · 1 年前

    尝试将pandas DataFrame列与datetime.date格式和datetime.time格式相结合时,我有点困惑。 DF看起来是这样的:

        VJNo    VJIdx   lnTime  lnDate
    0   32613   1   05:00:00    2023-04-18
    1   32613   2   05:01:00    2023-04-18
    2   32613   3   05:02:30    2023-04-18
    3   32613   5   05:05:30    2023-04-18
    4   32613   6   05:06:30    2023-04-18
    5   32613   8   05:07:30    2023-04-18
    6   32613   9   05:08:30    2023-04-18
    7   32613   11  05:10:30    2023-04-18
    

    我想用 pandas.Timestamp.combine(date, time) ,但显然它不想为数据系列工作。。。(?)运行:

    import pandas as pd
    
    # Defining the data
    data = {'VJNo': [32613, 32613, 32613, 32613, 32613, 32613, 32613, 32613],
            'VJIdx': [1, 2, 3, 5, 6, 8, 9, 11],
            'lnTime': ['05:00:00', '05:01:00', '05:02:30', '05:05:30', '05:06:30', '05:07:30', '05:08:30', '05:10:30'],
            'lnDate': ['2023-04-18', '2023-04-18', '2023-04-18', '2023-04-18', '2023-04-18', '2023-04-18', '2023-04-18', '2023-04-18']}
    
    # Create pandas dataframe
    df = pd.DataFrame(data)
    
    df['tmp'] = pd.Timestamp.combine( df['lnDate'], df['lnTime'])
    
    

    返回错误: combine() argument 1 must be datetime.date, not Series ,虽然是 datetime.date ,但一系列。。。 不幸的是,找到了其他解决方案 here 也不起作用(可能是由于熊猫的变化):

    df['tmp'] = df.apply(pd.Timestamp.combine, df['lnDate'], df['lnTime'])
    

    df['tmp'] = df.apply(lambda x: pd.Timestamp.combine(x['lnDate'], x['lnTime']))
    

    我做错什么了吗? 最后的手段可能是将日期和时间转换为字符串,然后使用 pd.to_datetime 在他们身上,但是。。。我认为这不是正确的方式。

    1 回复  |  直到 1 年前
        1
  •  2
  •   mozway    1 年前

    你需要 vectorize 您的功能:

    import numpy as np
    
    f = np.vectorize(pd.Timestamp.combine)
    # f = np.vectorize(lambda d,t: pd.Timestamp.combine(d, t))
    
    dfP['out'] = f(dfP['lnDate'], dfP['lnTime'])
    

    或者通过列表理解:

    dfP['out'] = [pd.Timestamp(d, t) for d, t in zip(df['lnDate'], df['lnTime'])]
    

    输出:

        VJNo  VJIdx    lnTime      lnDate                 out
    0  32613      1  05:00:00  2023-04-18 2023-04-18 05:00:00
    1  32613      2  05:01:00  2023-04-18 2023-04-18 05:01:00
    2  32613      3  05:02:30  2023-04-18 2023-04-18 05:02:30
    3  32613      5  05:05:30  2023-04-18 2023-04-18 05:05:30
    4  32613      6  05:06:30  2023-04-18 2023-04-18 05:06:30
    5  32613      8  05:07:30  2023-04-18 2023-04-18 05:07:30
    6  32613      9  05:08:30  2023-04-18 2023-04-18 05:08:30
    7  32613     11  05:10:30  2023-04-18 2023-04-18 05:10:30