python time mktime throw错误

时间:2015-04-01 23:04:03

标签: python datetime time pandas mktime

我正在尝试使用下面的代码将pandas datetime转换为epoch。

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版。我在这里缺少什么?

3 个答案:

答案 0 :(得分: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

不完全确定你想要的结果,但在TimeStamp对象上使用strftime会更接近:

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

1422748800.0

答案 1 :(得分: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)

答案 2 :(得分:0)

请参阅@ Padraic Cunningham's answer中对mktime()错误的解释。

  1. pandas.datetimedatetime.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
    
  3. 两种解决方案都忽略闰秒(除非在第二次使用“正确”时区)。