我有一个包含以下列的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参数).
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)
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)
我没有足够的声誉来评论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).
如果类型不同(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)
最好,
答案实际上取决于您的列类型是什么。就我而言,我有datetime和timedelta。
> 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)
您还可以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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66592 次 |
| 最近记录: |