将对象类型更改为 datetime64[ns]-pandas

Nil*_*age 8 python time dataframe pandas

我正在分析网络服务器日志文件并具有以下格式的日期时间。

02/Apr/2013:23:55:00 +0530
Run Code Online (Sandbox Code Playgroud)

我正在将其转换为 pandas 日期时间格式。

df['Time'] = pd.to_datetime(df['Time'])
Run Code Online (Sandbox Code Playgroud)

但它仍然是对象格式。

print df.dtypes
Run Code Online (Sandbox Code Playgroud)

时间对象

为什么它没有改变为datetime64[ns]

numpy 版本

In [2]: np.__version__
Out[2]: '1.8.0'
Run Code Online (Sandbox Code Playgroud)

Dmi*_* K. 8

抱歉,如果我错过了什么......

df['Time'] = df['Time'].astype('datetime64')
Run Code Online (Sandbox Code Playgroud)


alk*_*lko 4

以下答案取决于您的 python 版本。

Pandasto_datetime无法识别您的自定义日期时间格式,您应该明确提供它:

>>> import pandas as pd
>>> from datetime import datetime
>>> df = pd.DataFrame({'Time':['02/Apr/2013:23:55:00 +0530']},index=['tst'])
>>> from functools import partial
>>> to_datetime_fmt = partial(pd.to_datetime, format='%d/%b/%Y:%H:%M:%S %z')
Run Code Online (Sandbox Code Playgroud)

并应用这个自定义转换器

>>> df['Time'] = df['Time'].apply(to_datetime_fmt)
>>> df.dtypes
Time    datetime64[ns]
dtype: object
Run Code Online (Sandbox Code Playgroud)

但请注意,它从 python 版本3.2开始工作,在早期版本中%z不受支持。您必须手动添加 timedelta。

>>> from datetime import timedelta
>>> df = pd.DataFrame({'Time':['02/Apr/2013:23:55:00 +0530']},index=['tst'])
Run Code Online (Sandbox Code Playgroud)

将时间拆分为日期时间和偏移量

>>> def strptime_with_offset(string, format='%d/%b/%Y:%H:%M:%S'):
...    base_dt = datetime.strptime(string[:-6], format)
...    offset = int(string[-6:])
...    delta = timedelta(hours=offset/100, minutes=offset%100)
...    return base_dt + delta
...
Run Code Online (Sandbox Code Playgroud)

并应用此转换函数:

>>> df['Time'] = df['Time'].apply(strptime_with_offset)
>>> df['Time']
tst   2013-04-03 05:25:00
Name: Time, dtype: datetime64[ns]
>>> df.dtypes
Time    datetime64[ns]
dtype: object
Run Code Online (Sandbox Code Playgroud)