我有一个包含以下列的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
答案 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)
答案实际上取决于您的列类型。就我而言,我有datetime
和timedelta
。
> df[['Date','Time']].dtypes
Date datetime64[ns]
Time timedelta64[ns]
如果是这种情况,那么您只需要添加列:
> df['Date'] + df['Time']
答案 6 :(得分:1)
通过组合datetime
和datetime
对象,您也可以在不进行字符串连接的情况下转换为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)
数据:
代码:
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)