如何将 datetime.time() 对象转换为 datetime.datetime() 对象 Pandas

8
import pandas as pd
import datetime
df = pd.DataFrame([{'st':datetime.datetime.strptime('21:00:00','%H:%M:%S').time(),'et':datetime.datetime.strptime('22:00:00','%H:%M:%S').time()}, {'st':datetime.datetime.strptime('1:00:00','%H:%M:%S').time(),'et':datetime.datetime.strptime('3:00:00','%H:%M:%S').time()}])


Out[183]: df
         et        st
0  22:00:00  21:00:00
1  03:00:00  01:00:00

我希望能够将上述数据框转换为具有 datetime.datetime 对象的新字段,同时还有两个额外的列,这些列中包含任何虚拟日期,并使用它们各自行中的时间:
      et        st      sdate_time                edate_time
0  22:00:00  21:00:00   2018-01-01 21:00:00      2018-01-01 22:00:00  
1  03:00:00  01:00:00   2018-01-01 1:00:00       2018-01-01 3:00:00

我尝试的方法是使用apply方法。
df['et'].apply(lambda et: pd.datetime.combine(datetime.datetime.strptime('2018-01-01', '%Y-%m-%d').date(),et))

但事实证明,数据框可能非常巨大,我希望在不使用apply方法的情况下向量化上述操作。


df.apply(pd.to_datetime, format='%H:%M:%S') 对你有效吗?日期为1900-01-01。 - Scott Boston
不应使用apply()。 - Sujith Shivaprakash
3个回答

4

试试这个

date = str(datetime.datetime.strptime('2018-01-01', '%Y-%m-%d').date())

df['edate_time'] = pd.to_datetime(date + " " + df.et.astype(str))

       et          st            edate_time
0   22:00:00    21:00:00    2018-01-01 22:00:00
1   03:00:00    01:00:00    2018-01-01 03:00:00

1
此答案依赖于一个“虚假”的日期。 - Tobbey
@Tobbey 你所说的“假日期”是什么意思? - ResidentSleeper
需要提供一个任意格式的日期'2018-01-01'。 - Tobbey
@Tobbey你有更好的想法来定义一个仅包含时间信息的对象吗?你需要定义一个固定的数据。 - gies0r

3

尝试:

df.assign(sdate_time=pd.to_datetime(df['et'], format='%H:%M:%S'), 
          edate_time=pd.to_datetime(df['st'], format='%H:%M:%S'))

输出:

         et        st          sdate_time          edate_time
0  22:00:00  21:00:00 1900-01-01 22:00:00 1900-01-01 21:00:00
1  03:00:00  01:00:00 1900-01-01 03:00:00 1900-01-01 01:00:00

2

有没有比分配随机日期更好的方法?

我使用的是matplotlib版本“3.3.1”,但仍然面临无法绘制datetime.time对象的问题,我不需要日期,只需要一天中的24小时。

我已经看到了标签的解决方法,使用import matplotlib.dates as mdates,但这仍然不是最好的方法。


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