使用 pandas 合并日期和时间列

2024-12-24 08:55:00
admin
原创
164
摘要:问题描述:我有一个包含以下列的熊猫数据框: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-0...

问题描述:

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

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:

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

最好的,

解决方案 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它们分别创建datetimetimedeltea对象。与 组合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 秒replacevs 50 秒combine)。

解决方案 7:

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

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

然后你可以轻松地将它们结合起来:

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

解决方案 8:

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

> 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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1298  
  华为IPD产品开发流程是一套先进且成熟的产品开发管理体系,对众多企业提升产品竞争力有着重要的借鉴意义。它涵盖多个关键要素,这些要素相互关联、相互作用,共同构建起高效、科学的产品开发流程。深入剖析其中的五个核心要素,能让我们更好地理解华为成功背后的产品开发逻辑,为企业的产品创新与发展提供有力的指导。市场管理市场管理是IP...
IPD框架   17  
  华为集成产品开发(IPD)体系作为一套先进的产品开发管理理念和方法,在华为的发展历程中发挥了至关重要的作用。在供应链管理领域,IPD同样展现出巨大的价值,深刻影响着企业的运营效率、产品质量以及市场竞争力。通过将IPD理念融入供应链管理,华为实现了从产品规划到交付的全流程优化,为企业的持续发展奠定了坚实基础。IPD对供应...
IPD集成产品开发流程   19  
  IPD(Integrated Product Development)项目管理作为一种先进的产品开发管理模式,旨在通过整合跨部门资源,实现产品的高效开发与上市。然而,在实际推行过程中,IPD项目管理面临着诸多风险,若处理不当,可能导致项目进度延迟、成本超支甚至项目失败。深入了解这些风险并制定有效的应对策略,对于保障IP...
华为IPD流程   16  
  华为作为全球知名的科技企业,其成功背后的管理模式备受关注。其中,IPD(集成产品开发)产品开发流程对华为的创新发展起到了至关重要的推动作用。IPD不仅仅是一种流程,更是一种先进的管理理念,它将产品开发视为一个系统工程,涵盖了从市场需求分析、产品规划、研发、生产到上市等多个环节,通过整合企业内外部资源,实现高效、协同的产...
IPD流程中PDCP是什么意思   17  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用