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

时间:2013-11-04 08:48:49

标签: python time pandas dataframe

我正在分析Web服务器日志文件并以下列格式显示日期时间。

02/Apr/2013:23:55:00 +0530

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

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

但它仍然是对象格式。

print df.dtypes

时间对象

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

Numpy版

In [2]: np.__version__
Out[2]: '1.8.0'

3 个答案:

答案 0 :(得分:3)

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

Pandas'to_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')

并应用此自定义转换器

>>> df['Time'] = df['Time'].apply(to_datetime_fmt)
>>> df.dtypes
Time    datetime64[ns]
dtype: object

请注意,它不适用于python版本 3.2 ,在早期版本%z中不受支持。你必须手动添加timedelta。

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

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

>>> 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
...

并应用此转换功能:

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

答案 1 :(得分:0)

除了alko的方法,这个代码也运行良好。

from dateutil import parser

def parse(x):
    date, hh, mm, ss = x.split(':')
    dd, mo, yyyy = date.split('/')
    return parser.parse("%s %s %s %s:%s:%s" % (yyyy,mo,dd,hh,mm,ss))

df['Time'] = df['Time'].apply(lambda x:x[1:-7])

答案 2 :(得分:0)

对不起,如果我错过了什么...

print("Sales Amount: " + str(userQuantityPurchased + userPrice))