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


113

我有一个带有以下各栏的熊猫数据框;

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

如何合并data ['Date']和data ['Time']以获得以下内容?有办法做到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

感谢所有的答案。我已经尝试了其中的大多数,但是仍然在将此日期时间信息添加为较大数据框的一部分时仍然尝试过。datetime列仅显示日期,不显示时间信息。我们应该了解时间隐藏在那里还是被删除了?
karthikeyan,

Answers:


169

值得一提的是,你可能已经能够在阅读这直接,如果你正在使用如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]

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


6
不知道自动组合功能,它也可用于多个条目,例如:parse_dates=[['Start date', 'Start time'], ['End date', 'End time']])。熊猫<3
5agado

43

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

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)

2
time在熊猫中,我找不到关于dtype的任何信息。我有一个timedelta(和一个datetime),在这种情况下,您只需要添加它们,请参阅我的答案
toto_tico

当我“ pd.read_excel”是Excel标识为“时间”的Excel列时,pandas也会自动将其读取为“时间”,而无需任何解析参数。感谢您的解决方案。+1
赛义德(Saeed)

1
请注意,自熊猫1.0.0 pd.datetime 起已弃用,建议改为显式导入datetime模块。
CopOnTheRun

16

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

import pandas as pd    
data_file = 'data.csv' #path of your file

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

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 

您可以使用此行同时保留其他两列。

data.set_index(['Date', 'Time'], drop=False)

1
您还可以使用custom date_parser,例如parser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity

11

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

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))

结果:

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

最好,


10

我没有足够的声誉对jka.ne进行评论,所以:

我必须修改jka.ne的行才能使其工作:

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)

这可能会帮助其他人。

另外,我还测试了另一种方法,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)

在OP的情况下为:

combine_date_time(df, 'Date', 'Time')

我已经为两种方法设定了相对较大的数据集(> 500.000行)的时间,并且它们都具有相似的运行时,但是使用combine速度更快(的响应时间为59s replace与的响应时间为50s combine)。


5

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

> df[['Date','Time']].dtypes
Date     datetime64[ns]
Time    timedelta64[ns]

如果是这种情况,则只需添加以下列:

> df['Date'] + df['Time']

接受的答案采用字符串:“假设这些只是字符串,您可以简单地将它们添加在一起(带有空格)”。我的答案是datetimetimedelta。主要的答案以某种方式弄清楚了这些列是字符串,或者也许仅仅是发布问题的答案。
toto_tico

4

您还可以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

1
伟大的一般解决方案!我有类型日期时间日期和类型str时间,这工作。
麻雀

3

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

df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])

然后,您可以轻松地将它们组合:

df["DateTime"] = df["Date"] + df["Time"]

2

使用 combine功能:

datetime.datetime.combine(date, time)

2

我的数据集有1秒的分辨率数据,持续了几天,通过此处建议的方法进行解析非常慢。相反,我使用了:

dates = pandas.to_datetime(df.Date, cache=True)
times = pandas.to_timedelta(df.Time)
datetimes  = dates + times

请注意,cache=True由于我的文件中只有几个唯一的日期,因此使用make可以非常有效地解析日期,这对于合并的日期和时间列而言并非如此。


这就是我要做的。
Yaakov Bressler,

1

数据:

<TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL> SPFB.RTS,1,20190103,100100,106580.0000000,107260.0000000,106570.0000000 ,107230.0000000,3726

码:

data.columns = ['ticker', 'per', 'date', 'time', 'open', 'high', 'low', 'close', 'vol']    
data.datetime = pd.to_datetime(data.date.astype(str) + ' ' + data.time.astype(str), format='%Y%m%d %H%M%S')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.