将 Pandas 列转换为 DateTime

Convert Pandas Column to DateTime

提问人:Chris 提问时间:11/6/2014 最后编辑:wjandreaChris 更新时间:9/21/2023 访问量:1131478

问:

我在 pandas DataFrame 中有一个字段,该字段是以字符串格式导入的。

它应该是一个日期时间变量。如何将其转换为日期时间列,然后根据日期进行筛选?

例:

raw_data = pd.DataFrame({'Mycol': ['05SEP2014:00:00:00.000']})
Python Pandas 数据帧 日期 日期时间

评论


答:

810赞 chrisb 11/6/2014 #1

使用 to_datetime 函数,指定与数据匹配的格式

df['Mycol'] = pd.to_datetime(df['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

评论

169赞 samthebrand 4/23/2017
注意:该参数不是必需的。 很聪明。继续尝试,不要尝试匹配您的数据。formatto_datetime
6赞 cottontail 1/30/2023
format不是必需的,但传递它会使转换运行得更快。有关详细信息,请参阅此答案
0赞 Trenton McKinney 5/26/2023
更准确地说,在 OP 的情况下,是必需的,否则会发生。 可以推断某些字符串格式,但如前所述,使用可以大大提高性能。formatDateParseErrorpandasformat
71赞 mechanical_meat 11/6/2014 #2

编辑:建议使用这个来代替这个,因为通常速度较慢。pd.to_datetime().apply()

您可以使用 DataFrame 方法 .apply() 对 Mycol 中的值进行操作:

>>> df = pd.DataFrame(['05SEP2014:00:00:00.000'], columns=['Mycol'])
>>> df
                    Mycol
0  05SEP2014:00:00:00.000
>>> import datetime as dt
>>> df['Mycol'] = df['Mycol'].apply(lambda x: 
...     dt.datetime.strptime(x, '%d%b%Y:%H:%M:%S.%f'))
>>> df
       Mycol
0 2014-09-05

评论

0赞 wjandrea 5/24/2023
为什么要用这个?pd.to_datetime
1赞 mechanical_meat 5/26/2023
当我写这篇文章时,我可能还没有看到。添加了使用 的建议。谢谢你的评论。pd.to_datetimepd.to_datetime
110赞 Vlad Bezden 3/17/2019 #3

如果要转换多个列,可以执行以下操作:

df[["col1", "col2", "col3"]] = df[["col1", "col2", "col3"]].apply(pd.to_datetime)

评论

1赞 Rafs 7/13/2023
如果这些列中有不同的日期时间格式,可以尝试使用以下参数:formatapply(pd.to_datetime, format='mixed')
46赞 Prateek Sharma 9/23/2019 #4

使用 pandas 函数将列分析为 DateTime。此外,通过使用 ,它将自动检测格式并将提到的列转换为 DateTime。to_datetimeinfer_datetime_format=True

import pandas as pd
raw_data['Mycol'] = pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
17赞 Gil Baggio 10/30/2021 #5

节省时间:

raw_data['Mycol'] = pd.to_datetime(raw_data['Mycol'])

评论

1赞 Gonçalo Peres 10/5/2022
这不适用于此特定用例。它给出了一个 .ParserError: Unknown string format: 05SEP2014:00:00:00.000
-2赞 Amar nayak 8/23/2022 #6

就像我们将对象数据类型转换为 float 或 int 一样,使用 astype()。

raw_data['Mycol'] = raw_data['Mycol'].astype('datetime64[ns]')

评论

1赞 Gonçalo Peres 10/5/2022
这不适用于此特定用例。它给出了一个 .ParserError: Unknown string format: 05SEP2014:00:00:00.000
8赞 cottontail 1/30/2023 #7
设置正确的方法比让熊猫找出1 要快得多format=

长话短说,像 chrisb 的帖子一样从头开始传递正确的内容比让熊猫弄清楚格式要快得多,尤其是在格式包含时间组件的情况下。大于 10k 行的数据帧的运行时差异是巨大的(~25 倍,所以我们说的是几分钟而不是几秒钟)。所有有效的格式选项都可以在 https://strftime.org/ 找到。format=

perfplot

errors='coerce'很有用

如果某些行的格式不正确或根本没有日期时间,则参数非常有用,以便您可以转换有效行并在以后处理包含无效值的行。errors=

df['date'] = pd.to_datetime(
    df['date'], format='%d%b%Y:%H:%M:%S.%f', errors='coerce')

# for multiple columns
df[['start', 'end']] = df[['start', 'end']].apply(
    pd.to_datetime, format='%d%b%Y:%H:%M:%S.%f', errors='coerce')
沉默SettingWithCopyWarning

顺便说一句,如果您收到此警告,则意味着您的数据帧可能是通过过滤另一个数据帧创建的。启用写入时复制,一切顺利。(有关更多信息,请参阅此帖子)。

pd.set_option('copy_on_write', True)
df['date'] = pd.to_datetime(df['date'], format='%d%b%Y:%H:%M:%S.%f')

1 用于生成 timeit 测试图的代码。

import perfplot
from random import choices
from datetime import datetime

mdYHMSf = range(1,13), range(1,29), range(2000,2024), range(24), *[range(60)]*2, range(1000)
perfplot.show(
    kernels=[lambda x: pd.to_datetime(x), 
             lambda x: pd.to_datetime(x, format='%m/%d/%Y %H:%M:%S.%f'), 
             lambda x: pd.to_datetime(x, infer_datetime_format=True),
             lambda s: s.apply(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M:%S.%f'))],
    labels=["pd.to_datetime(df['date'])", 
            "pd.to_datetime(df['date'], format='%m/%d/%Y %H:%M:%S.%f')", 
            "pd.to_datetime(df['date'], infer_datetime_format=True)", 
            "df['date'].apply(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M:%S.%f'))"],
    n_range=[2**k for k in range(20)],
    setup=lambda n: pd.Series([f"{m}/{d}/{Y} {H}:{M}:{S}.{f}" 
                               for m,d,Y,H,M,S,f in zip(*[choices(e, k=n) for e in mdYHMSf])]),
    equality_check=pd.Series.equals,
    xlabel='len(df)'
)

如果列包含多种格式,请参阅将混合格式字符串列转换为日期时间 Dtype