使用python pandas组合日期和时间列

ric*_*hie 97 python pandas

我有一个包含以下列的pandas数据帧;

Date              Time
01-06-2013      23:00:00
02-06-2013      01:00:00
02-06-2013      21:00:00
02-06-2013      22:00:00
02-06-2013      23:00:00
03-06-2013      01:00:00
03-06-2013      21:00:00
03-06-2013      22:00:00
03-06-2013      23:00:00
04-06-2013      01:00:00
Run Code Online (Sandbox Code Playgroud)

如何组合数据['日期']和数据['时间']以获得以下内容?有没有办法使用它pd.to_datetime

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00
Run Code Online (Sandbox Code Playgroud)

And*_*den 144

值得一提的是,您可能已经能够直接阅读此内容,例如,如果您正在read_csv使用parse_dates=[['Date', 'Time']].

假设这些只是字符串,您可以简单地将它们一起添加(带空格),允许您应用to_datetime:

In [11]: df['Date'] + ' ' + df['Time']
Out[11]:
0    01-06-2013 23:00:00
1    02-06-2013 01:00:00
2    02-06-2013 21:00:00
3    02-06-2013 22:00:00
4    02-06-2013 23:00:00
5    03-06-2013 01:00:00
6    03-06-2013 21:00:00
7    03-06-2013 22:00:00
8    03-06-2013 23:00:00
9    04-06-2013 01:00:00
dtype: object

In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
Out[12]:
0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

注意:令人惊讶的是(对我而言),这可以很好地将NaN转换为NaT,但值得担心的是转换(可能使用raise参数).

  • 不知道自动组合功能,它也可用于多个条目,例如:'parse_dates = [['开始日期','开始时间'],['结束日期','结束时间']])) 。熊猫<3 (2认同)

jka*_*.ne 34

接受的答案适用于数据类型的列string.为了完整性:当列的数据类型为:日期和时间时,我在搜索如何执行此操作时遇到此问题.

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,从 pandas 1.0.0 `pd.datetime` [已弃用](https://pandas.pydata.org/pandas-docs/version/1.0.0/whatsnew/v1.0.0.html#deprecations )并且建议只显式导入“datetime”模块。 (3认同)
  • 我在 Pandas 中找不到任何关于 `time` dtype 的信息。我有一个`timedelta`(和一个`datetime`),在这种情况下你只需要添加它们,[见我的答案](/sf/answers/3524669011/) (2认同)

que*_*ise 12

首先确保有正确的数据类型:

df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])
Run Code Online (Sandbox Code Playgroud)

然后你可以轻松地将它们组合起来:

df["DateTime"] = df["Date"] + df["Time"]
Run Code Online (Sandbox Code Playgroud)


小智 11

您可以使用它将日期和时间合并到同一列数据框中.

import pandas as pd    
data_file = 'data.csv' #path of your file
Run Code Online (Sandbox Code Playgroud)

读取带有合并列Date_Time的.csv文件:

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 
Run Code Online (Sandbox Code Playgroud)

您也可以使用此行来保留其他列.

data.set_index(['Date', 'Time'], drop=False)
Run Code Online (Sandbox Code Playgroud)


jab*_*lcu 8

我没有足够的声誉来评论jka.ne所以:

我不得不修改jka.ne的行以使其工作:

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)
Run Code Online (Sandbox Code Playgroud)

这可能有助于其他人.

另外,我测试了一种不同的方法,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)
Run Code Online (Sandbox Code Playgroud)

在OP的案例中将是:

combine_date_time(df, 'Date', 'Time')
Run Code Online (Sandbox Code Playgroud)

我已经为两个相对较大的数据集(> 500.000行)设置了两种方法,并且它们都具有相似的运行时间,但使用combine速度更快(对于replace50s而言为59s combine).


Chr*_*ERE 7

如果类型不同(datetime和timestamp或str),则可以强制转换列,并使用to_datetime:

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))
Run Code Online (Sandbox Code Playgroud)

结果:

0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
Run Code Online (Sandbox Code Playgroud)

最好,


tot*_*ico 6

答案实际上取决于您的列类型是什么。就我而言,我有datetimetimedelta

> df[['Date','Time']].dtypes
Date     datetime64[ns]
Time    timedelta64[ns]
Run Code Online (Sandbox Code Playgroud)

如果这是您的情况,那么您只需要添加列:

> df['Date'] + df['Time']
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 6

您还可以datetime通过组合datetimetimedelta对象转换为不连接字符串。结合pd.DataFrame.pop,您可以同时删除源系列:

df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time'))

print(df)

             DateTime
0 2013-01-06 23:00:00
1 2013-02-06 01:00:00
2 2013-02-06 21:00:00
3 2013-02-06 22:00:00
4 2013-02-06 23:00:00
5 2013-03-06 01:00:00
6 2013-03-06 21:00:00
7 2013-03-06 22:00:00
8 2013-03-06 23:00:00
9 2013-04-06 01:00:00

print(df.dtypes)

DateTime    datetime64[ns]
dtype: object
Run Code Online (Sandbox Code Playgroud)

  • 很棒的通用解决方案!我输入了 datetime date 并输入了 str time,这有效。 (3认同)
  • 实际上,这比接受的答案要快得多,特别是如果日期列已经是“pd.Timestamp”类型。 (2认同)