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

jv4diomz  于 2023-01-28  发布在  其他
关注(0)|答案(6)|浏览(142)

如何将DataFrame字符串列(***dd/mm/yyyy***格式)转换为日期时间数据类型?

yptwkmov

yptwkmov1#

最简单的方法是使用to_datetime

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

它还为欧洲时报提供了一个dayfirst的论据(但要小心this isn't strict)。
以下是它的实际应用:

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]
5m1hhzi4

5m1hhzi42#

如果您的日期列是一个格式为'2017-01-01'的字符串,您可以使用pandas类型将其转换为datetime。

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

或者,如果需要“天”精度而不是“纳秒”精度,则使用datetime 64 [D

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

收益率

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

与使用pandas.to日期时间时相同
您可以尝试使用“%Y-%m-%d”以外的其他格式,但至少此格式有效。

ar5n3qh5

ar5n3qh53#

如果要指定复杂的格式,可以使用以下命令:

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

有关format的更多详细信息,请访问:

  • Python 2https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior
  • Python 3https://docs.python.org/3.7/library/datetime.html#strftime-strptime-behavior
nhn9ugyo

nhn9ugyo4#

如果您的日期格式混合在一起,不要忘记设置infer_datetime_format=True以简化工作。
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
来源:pd.to_日期时间
或者,如果您需要定制的方法:

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)
q7solyqu

q7solyqu5#

尝试此解决方案:

  • 变更'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
tktrz96b

tktrz96b6#

多个日期时间列

如果要将多个字符串列转换为datetime,则使用apply()会很有用。

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

您可以将参数作为kwargs传递给to_datetime

df[['start_date', 'end_date']] = df[['start_date', 'end_date']].apply(pd.to_datetime, format="%m/%d/%Y")
使用format=加快速度

如果列包含一个time组件,并且您知道datetime/time的格式,那么显式传递格式将显著加快转换速度。然而,如果列只有date,则几乎没有任何区别。在我的项目中,对于一个有500万行的列,差异是巨大的:约2.5分钟与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)'
)

相关问题