2015-04-01 2 views
0

Я пытаюсь преобразовать pandas datetime в эпоху, используя приведенный ниже код.python time mktime throwing error

import time 
import pandas as pd 

compare_date = pd.datetime.today()+pd.DateOffset(days=-60) 
print time.mktime(datetime.datetime.strptime(compare_date, "%Y-%m-%d").timetuple()) 

Это бросает ошибку

'unicode' object has no attribute 'mktime' 

Я пытался с этим кодом, а

t = (2009, 2, 17, 17, 3, 38, 1, 48, 0) 
secs = time.mktime(t) 
print secs 

И, по-прежнему бросает ту же ошибку. Я использую Python версии 2.7.5. Что мне здесь не хватает?

ответ

2

Вы каким-то образом установить time равным unicode объекта в вашем коде, вы не можете передать Timestamp к strptime он должен быть снабжать струной, тетивой и т.п.

In [15]: time = u"foo" 

In [16]: time.mktime 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-16-b93f36374edc> in <module>() 
----> 1 time.mktime 

AttributeError: 'unicode' object has no attribute 'mktime' 

Вам нужно пройти через код и посмотреть, где у вас есть ссылки на time, где-то у вас есть time = some_unicode_object

Не совсем уверен, что вы хотите в конце, но используя strftime на объекте TimeStamp будет ближе:

print time.mktime(datetime.datetime.strptime(compare_date.strftime("%Y-%m-%d"), "%Y-%m-%d").timetuple()) 

1422748800.0 
+0

Да, вы правы. Я читал переменную с именем «время». Благодаря! – ubh

+0

Нет проблем. Добро пожаловать –

+0

@ J.F.Sebastian, извините, что да означает strptime. –

1

Это не объяснение ошибки (см. Ответ Padraic Cunningham), а скорее более короткий путь достижения вашей конечной цели.

Вы, кажется, конвертируете compare_date в кортеж. Это прямой способ сделать это в панд:

import pandas as pd 
compare_date = pd.datetime.today()+pd.DateOffset(days=-60) 
print compare_date.timetuple() 

Результирующее в:

time.struct_time(tm_year=2015, tm_mon=2, tm_mday=1, tm_hour=1, 
       tm_min=20, tm_sec=43, tm_wday=6, tm_yday=32, tm_isdst=-1) 
+0

Да, я мог бы получить эпоху, выполняя time.mktime (compare_date.timetuple()) – ubh

0

Смотрите объяснение mktime() ошибки в @Padraic Cunningham's answer.

  1. pandas.datetime является datetime.datetime. Вы должны использовать его непосредственно:

    from datetime import datetime, timedelta 
    
    compare_date = datetime.utcnow() - timedelta(60) 
    posix_timestamp = (compare_date - datetime(1970, 1, 1)).total_seconds() 
    

    См Converting datetime.date to UTC timestamp in Python

    Если вы compare_date не в UTC, то вы должны преобразовать его в UTC первым. См. Find if 24 hrs have passed between datetimes - Python - примечание: mktime() может потерпеть неудачу!

  2. Чтобы получить метку времени (время эпохальное) более непосредственно, можно использовать time.time():

    import time 
    
    timestamp = time.time() - 60 * 86400 # 60 days ago 
    

Оба решения игнорировать високосные секунды (если «правильно» часовой пояс используется во 2-м один).