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

2024-12-04 08:56:00
admin
原创
160
摘要:问题描述:如何将 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1572  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   0  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   0  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用