2013-11-04 49 views
2

我正在分析Web服务器日志文件并使用以下格式的日期时间。将对象类型更改为datetime64 [ns] -pandas

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

我把它转换成熊猫日期时间格式。

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

但仍然是对象格式。

print df.dtypes 

Time对象

为什么不更改为datetime64[ns]

numpy的版本

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

回答

3

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

大熊猫to_datetime不能识别您的自定义日期时间格式,你应该explicetly提供它:

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

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

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

时间分割成datetime和偏移

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

非常感谢您的回答。它给出了以下错误。为什么增加一个空间? ValueError:time data '02/Apr/2013 23:55:00'不符合格式'%d /%b /%Y:%H:%M:%S' –

+0

首先,可能是您的真实数据是'02/Apr/2013 23:55:00'。您可以使用适当的格式,例如''%d /%b /%Y%H:%M:%S'。第二,我的回答并不完全正确,我很快就会更新 – alko

+0

没有我的真实数据是您发布的格式。例如。 [02/Apr/2013:23:55:00 +0530],[02/Apr/2013:23:55:09 + 0530],[02/Apr/2013:23:55:18 +0530]等。 –

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]) 
+0

请注意,在这里你明确地省略了偏移量'+ 0530'并得到不同的结果,'2013-04-02 23:55:00'而不是'2013-04-03 05:25:00'。我不知道_desired_是什么结果,但后者似乎更适合,因为您的数据可能有不同的偏移量。 – alko

+0

它必须是'-6',而不是'-7',或者你应该得到'ValueError()' – alko

+0

@alko谢谢你。 –

相关问题