使用 pandas 合并日期和时间列
- 2024-12-24 08:55:00
- admin 原创
- 165
问题描述:
我有一个包含以下列的熊猫数据框:
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
解决方案 1:
值得一提的是,您可能能够直接读取该内容,例如如果您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 擅长推断要转换为 的格式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)
解决方案 2:
接受的答案适用于数据类型为 的列string
。为了完整起见:我在搜索当列的数据类型为:日期和时间时如何执行此操作时遇到了这个问题。
df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)
解决方案 3:
如果类型不同(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
最好的,
解决方案 4:
您可以使用它将日期和时间合并到数据框的同一列中。
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)
解决方案 5:
您还可以datetime
通过组合to_datetime
和来转换为不带字符串连接的序列,to_timedelta
它们分别创建datetime
和timedeltea
对象。与 组合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
解决方案 6:
我没有足够的声誉来对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 秒replace
vs 50 秒combine
)。
解决方案 7:
首先确保具有正确的数据类型:
df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])
然后你可以轻松地将它们结合起来:
df["DateTime"] = df["Date"] + df["Time"]
解决方案 8:
答案实际上取决于您的列类型。就我而言,我有datetime
和timedelta
。
> df[['Date','Time']].dtypes
Date datetime64[ns]
Time timedelta64[ns]
如果是这种情况,那么您只需添加以下列:
> df['Date'] + df['Time']
解决方案 9:
使用 combine
函数:
datetime.datetime.combine(date, time)
解决方案 10:
这里有一个方法可以实现。你只需将每列中的两个字符串连接起来,中间用“ ”空格隔开即可。
假设 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")
干杯!祝数据处理愉快。
解决方案 11:
我的数据集有几天的 1 秒分辨率数据,使用这里建议的方法解析非常慢。相反,我使用了:
dates = pandas.to_datetime(df.Date, cache=True)
times = pandas.to_timedelta(df.Time)
datetimes = dates + times
请注意,使用cache=True
可以非常有效地解析日期,因为我的文件中只有几个唯一的日期,而对于组合日期和时间列来说则不然。
解决方案 12:
数据:
<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')
解决方案 13:
我认为最好的解决方案是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)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)