166

我有一个带有以下列的熊猫数据框:

data = {'Date': ['01-06-2013', '02-06-2013', '02-06-2013', '02-06-2013', '02-06-2013', '03-06-2013', '03-06-2013', '03-06-2013', '03-06-2013', '04-06-2013'],
        'Time': ['23:00:00', '01:00:00', '21:00:00', '22:00:00', '23:00:00', '01:00:00', '21:00:00', '22:00:00', '23:00:00', '01:00:00']}
df = pd.DataFrame(data)

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

如何结合 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
4

13 回答 13

245

值得一提的是,如果read_csv使用parse_dates=[['Date', 'Time']].

假设这些只是字符串,您可以简单地将它们添加在一起(带空格),允许您使用to_datetime,无需指定format=参数即可

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]

或者,没有+ ' ', 但format=必须使用参数。此外,pandas 擅长推断要转换为 a 的格式datetime,但是,指定确切的格式更快。

pd.to_datetime(df['Date'] + df['Time'], format='%m-%d-%Y%H:%M:%S')

注意:令人惊讶的是(对我而言),这适用于将 NaN 转换为 NaT 的情况,但值得担心的是转换(可能使用raise参数)。

%%timeit

# sample dataframe with 10000000 rows using df from the OP
df = pd.concat([df for _ in range(1000000)]).reset_index(drop=True)

%%timeit
pd.to_datetime(df['Date'] + ' ' + df['Time'])
[result]:
1.73 s ± 10.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
pd.to_datetime(df['Date'] + df['Time'], format='%m-%d-%Y%H:%M:%S')
[result]:
1.33 s ± 9.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
于 2013-07-31T18:33:05.613 回答
54

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

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)
于 2016-09-13T16:24:48.117 回答
30

如果类型不同(datetimetimestampstr),则转换列并使用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

最好的,

于 2018-04-05T09:22:53.190 回答
22

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

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)
于 2017-07-05T08:16:16.477 回答
12

我没有足够的声誉来评论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速度更快(59 秒replacevs 50 秒combine)。

于 2017-02-23T10:28:31.117 回答
10

您还可以通过组合和,分别创建和对象来转换为datetime不连接字符串。结合,您可以同时删除源系列:to_datetimeto_timedeltadatetimetimedelteapd.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
于 2018-08-02T10:43:08.840 回答
6

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

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

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

> df['Date'] + df['Time']
于 2018-05-15T14:10:19.650 回答
5

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

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

然后你很容易将它们组合起来:

df["DateTime"] = df["Date"] + df["Time"]
于 2018-08-06T16:11:08.937 回答
4

使用 combine功能:

datetime.datetime.combine(date, time)
于 2018-08-28T08:11:54.537 回答
2

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

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

请注意,使用cache=True使得解析日期非常有效,因为我的文件中只有几个唯一的日期,这对于组合的日期和时间列不适用。

于 2019-07-16T15:38:16.537 回答
2

数据:

<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')
于 2020-08-02T01:42:00.227 回答
2

这是一个单一的班轮,做到这一点。您只需将每列中的两个字符串连接起来,并在它们之间用 " " 空格连接。

说 df 是您的数据框,列是“时间”和“日期”。您的新专栏是 DateAndTime。

df['DateAndTime'] = df['Date'].str.cat(df['Time'],sep=" ")

如果您还想处理日期时间对象等条目,您可以这样做。您可以根据需要调整格式。

df['DateAndTime'] = pd.to_datetime(df['DateAndTime'], format="%m/%d/%Y %I:%M:%S %p")

干杯!!快乐的数据处理。

于 2021-02-08T04:53:10.487 回答
-3

我认为最好的解决方案是直接解析read_csv(或其他 read_ 函数)内的日期。如何在 date_parser 中管理两列并不明显,但这里是:

date_parser = lambda x,y: datetime.strptime(f"{x}T{y}", "%d-%m-%YT%H:%M:%S")
date = pd.read_csv('data.csv', parse_dates={'date': ['Date', 'Time']}, date_parser=date_parser)
于 2021-07-13T09:59:18.693 回答