我正在分析 Web 服务器日志文件并具有以下格式的日期时间。
02/Apr/2013:23:55:00 +0530
我正在将其转换为 pandas 日期时间格式。
df['Time'] = pd.to_datetime(df['Time'])
但它仍然是对象格式。
print df.dtypes
时间对象
为什么它不改变datetime64[ns]
?
麻木版本
In [2]: np.__version__
Out[2]: '1.8.0'
对不起,如果我错过了什么...
df['Time'] = df['Time'].astype('datetime64')
以下答案取决于您的 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')
并应用此自定义转换器
>>> 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
除了 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])