【问题标题】:Combine date column and time column into datetime column将日期列和时间列合并为日期时间列
【发布时间】:2013-11-29 08:06:29
【问题描述】:

我有一个这样的 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 似乎做了我想做的事,但是,我需要以某种方式按列应用这个函数。我怎样才能做到这一点?

【问题讨论】:

标签: python datetime pandas data-analysis


【解决方案1】:

你可以使用apply方法,像这样apply combine:

>>> 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

【讨论】:

  • 嘿,我遇到了类似的问题,我尝试了这个 - 但我收到一个错误 - combine() 参数 1 必须是 datetime.date,而不是 Series。我想 combine 不会占用整个系列,一次只占用一个元素。我该如何解决这个问题?
【解决方案2】:

其他解决方案对我不起作用,所以我想出了一个解决方法,使用 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 对此的回答。

UPDATE2:我试过jezrael的方法:

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

相比之下,这种方法非常快,jezrael 是对的。虽然我无法测量它,但它是显而易见的。

【讨论】:

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

您可以先将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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2021-10-22
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多