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

时间:2013-07-31 18:27:41

标签: 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

如何组合数据['日期']&数据['时间']得到以下内容?有没有办法使用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

13 个答案:

答案 0 :(得分:114)

值得一提的是,您可以在直接中阅读此内容,例如:如果您使用parse_dates=[['Date', 'Time']]使用read_csv

假设这些只是字符串,您可以简单地将它们一起添加(带空格),允许您应用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参数)。

答案 1 :(得分:27)

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

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

答案 2 :(得分:8)

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

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)

答案 3 :(得分:7)

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

我必须修改jka.ne's line才能使其正常工作:

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的速度更快(replace为59s而{{1}为50s }})。

答案 4 :(得分:4)

如果类型不同(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

最好,

答案 5 :(得分:3)

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

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

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

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

答案 6 :(得分:1)

通过组合datetimedatetime对象,您也可以在不进行字符串连接的情况下转换为timedelta。与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

答案 7 :(得分:1)

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

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

然后您可以轻松地将它们组合在一起:

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

答案 8 :(得分:1)

使用combine函数:

datetime.datetime.combine(date, time)

答案 9 :(得分:1)

数据:

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

这是一个单班轮,去做吧。您只需将每一列中的两个字符串连接起来,中间有一个“”空格。

说 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")

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

答案 12 :(得分:0)

我认为最好的解决方案是直接在 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)