将日期列和时间列合并成日期时间列

7
我有一个Pandas数据框,像这样;(通过解析Excel文件获得)
|     |     COMPANY NAME           | MEETING DATE        | MEETING TIME|
-----------------------------------------------------------------------|
|YKSGR|    YAPI KREDİ SİGORTA A.Ş. | 2013-12-16 00:00:00 |14:00:00     |
|TRCAS|    TURCAS PETROL A.Ş.      | 2013-12-12 00:00:00 |13:30:00     |

MEETING DATE是一个时间戳,表示为Timestamp('2013-12-20 00:00:00', tz=None),而MEETING TIME是一个datetime.time对象,表示为datetime.time(14, 0)

我想将MEETING DATEMEETING TIME合并成一列。 datetime.combine似乎可以实现我的需求,但是,我需要以某种方式逐列应用此函数。我该如何实现这一点?


或许你可以将该函数(或任何你想要的函数)应用到“MEETING DATE”和“MEETING TIME”上。http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html - dm03514
3个回答

10
您可以使用apply方法,以及像这样组合apply:
>>> df.apply(lambda x: combine(x['MEETING DATE'], x['MEETING TIME']), axis=1)
0   2013-12-16 14:00:00
1   2013-12-12 13:00:00

1
嘿,我遇到了类似的问题,我尝试了这个方法 - 但是我收到了一个错误提示 - combine()的第一个参数必须是datetime.date类型,而不是Series。我猜combine()函数只能一次处理一个元素,而不能处理整个序列。那么我该怎么解决这个问题呢? - pradeep

3

其他方案对我没用,所以我想出了一个解决方法,使用 replace 替代 combine

def combine_date_time(df, datecol, timecol):
   return df.apply(lambda row: row[datecol].replace(
      hour=row[timecol].hour,
      minute=row[timecol].minute),
      axis=1
   )

在你的情况下:
combine_date_time(df, 'MEETING DATE', 'MEETING TIME')

感觉速度有点慢(我没有准确计时),但它可以工作。

更新:我已经为一个相对较大的数据集(> 500,000行)计时了两种方法,它们都具有类似的运行时间,但使用combine更快(replace为59秒,combine为50秒)。此外,请参见jezrael在这方面的回答。

更新2:我已经尝试了jezrael的方法:

def combine_date_time(df, datecol, timecol):
    return pd.to_datetime(df[datecol].dt.date.astype(str)
                          + ' '
                          + df[timecol].astype(str))

与之相比,这种方法速度飞快。正如jezrael所说的那样。我还没有能够测量它,但显然很有效。


我添加了更快的解决方案,您可以检查一下。 - jezrael
我的解决方案有多快? - jezrael
@jezrael 抱歉,我还没有能够让它工作。我现在无法花时间在这上面。不过还是感谢你的贡献。 - jabellcu
1
在pandas中,最好使用非常快的矢量化函数,如果不存在,则使用apply,因为它很慢。没有问题。 - jezrael

2

您可以先将 Time 列转换为 string,然后再使用to_timedelta,然后很容易地对这两列求和:

print (type(df['MEETING DATE'].iat[0]))
<class 'pandas.tslib.Timestamp'>

print (type(df['MEETING TIME'].iat[0]))
<class 'datetime.time'>

print (df['MEETING DATE'] + pd.to_timedelta(df['MEETING TIME'].astype(str)))
YKSGR   2013-12-16 14:00:00
TRCAS   2013-12-12 13:30:00
dtype: datetime64[ns]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接