将 DataFrame 列类型从字符串转换为日期时间

2024-12-04 08:56:00
admin
原创
159
摘要:问题描述:如何将 DataFrame 字符串列(dd/mm/yyyy格式)转换为 datetime dtype?解决方案 1:最简单的方法是使用to_datetime:df['col'] = pd.to_datetime(df['col']) 它还dayfirst为欧洲时代提供了一个论据(但请注意这并不严格)...

问题描述:

如何将 DataFrame 字符串列(dd/mm/yyyy格式)转换为 datetime dtype?


解决方案 1:

最简单的方法是使用to_datetime

df['col'] = pd.to_datetime(df['col'])

它还dayfirst为欧洲时代提供了一个论据(但请注意这并不严格)。

实际操作如下:

In [11]: pd.to_datetime(pd.Series(['05/23/2005']))
Out[11]:
0   2005-05-23 00:00:00
dtype: datetime64[ns]

您可以传递特定的格式:

In [12]: pd.to_datetime(pd.Series(['05/23/2005']), format="%m/%d/%Y")
Out[12]:
0   2005-05-23
dtype: datetime64[ns]

解决方案 2:

如果您的日期列是格式为“2017-01-01”的字符串,则可以使用 pandas astype 将其转换为日期时间。

df['date'] = df['date'].astype('datetime64[ns]')

或者使用 datetime64[D] 如果你想要天精度而不是纳秒

print(type(df['date'].iloc[0])) 

产量

<class 'pandas._libs.tslib.Timestamp'>

与使用 pandas.to_datetime 时相同

您可以尝试使用“%Y-%m-%d”以外的其他格式,但至少这是可行的。

解决方案 3:

如果您想指定棘手的格式,可以使用以下命令:

df['date_col'] =  pd.to_datetime(df['date_col'], format='%d/%m/%Y')

更多详细信息请参见format此处:

解决方案 4:

如果您的日期混合了多种格式,请不要忘记设置infer_datetime_format=True以使生活更轻松。

df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)

来源:pd.to_datetime

或者如果您想要一种定制的方法:

def autoconvert_datetime(value):
    formats = ['%m/%d/%Y', '%m-%d-%y']  # formats to try
    result_format = '%d-%m-%Y'  # output format
    for dt_format in formats:
        try:
            dt_obj = datetime.strptime(value, dt_format)
            return dt_obj.strftime(result_format)
        except Exception as e:  # throws exception when format doesn't match
            pass
    return value  # let it be if it doesn't match

df['date'] = df['date'].apply(autoconvert_datetime)

解决方案 5:

多个日期时间列

如果您想将多个字符串列转换为日期时间,那么使用apply()会很有用。

df[['date1', 'date2']] = df[['date1', 'date2']].apply(pd.to_datetime)

您可以将参数传递给to_datetimekwargs。

df[['start_date', 'end_date']] = df[['start_date', 'end_date']].apply(pd.to_datetime, format="%m/%d/%Y")

传递给apply而不指定axis,仍会将值转换为每个列 的向量。apply这里需要 ,因为pd.to_datetime只能在单个列上调用 。如果必须在多个列上调用它,则选项是使用显式for-loop,或将其传递给apply。另一方面,如果您在列上调用pd.to_datetime使用(例如,则不会被矢量化,应避免使用。apply`df['date'].apply(pd.to_datetime))`


使用format=加速

如果列包含时间部分,并且您知道日期时间/时间的格式,那么明确传递格式将显著加快转换速度。但如果列只有日期,则几乎没有任何区别。在我的项目中,对于包含 500 万行的列,差异很大:~2.5 分钟 vs 6 秒。

事实证明,明确指定格式大约快 25 倍。以下运行时图显示,根据是否传递格式,性能存在巨大差距。

时间安排


用于生成图表的代码:

import perfplot
import random

mdYHM = range(1, 13), range(1, 29), range(2000, 2024), range(24), range(60)
perfplot.show(
    kernels=[lambda x: pd.to_datetime(x), lambda x: pd.to_datetime(x, format='%m/%d/%Y %H:%M')],
    labels=['pd.to_datetime(x)', "pd.to_datetime(x, format='%m/%d/%Y %H:%M')"],
    n_range=[2**k for k in range(19)],
    setup=lambda n: pd.Series([f"{m}/{d}/{Y} {H}:{M}" 
                               for m,d,Y,H,M in zip(*[random.choices(e, k=n) for e in mdYHM])]),
    equality_check=pd.Series.equals,
    xlabel='len(df)'
)

解决方案 6:

尝试这个解决方案:

  • 改变'2022–12–31 00:00:00' to '2022–12–31 00:00:01'

  • 然后运行此代码:pandas.to_datetime(pandas.Series(['2022–12–31 00:00:01']))

  • 输出:2022–12–31 00:00:01

解决方案 7:

print(df1.shape)
(638765, 95)

%timeit df1['Datetime'] = pd.to_datetime(df1['Date']+" "+df1['HOUR'])
473 ms ± 8.33 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df1['Datetime'] = pd.to_datetime(df1['Date']+" "+df1['HOUR'], format='mixed')
688 ms ± 3.14 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df1['Datetime'] = pd.to_datetime(df1['Date']+" "+df1['HOUR'], format='%Y-%m-%d %H:%M:%S')
470 ms ± 7.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用