2014-02-16 80 views
0

我的日期直方圖查詢返回的是這樣的:如何將從elasticsearch返回的64位時間戳轉換爲python中的datetime?

"facets": { 
    "hist": { 
    "_type": "date_histogram", 
    "entries": [ 
     { 
      "time": 1385856000000, 
      "count": 1884 
     }, 
     { 
      "time": 1385942400000, 
      "count": 1902 
     }, 

我怎麼能採取的時間價值,並得到一個日期字符串:「2014年2月16日」?

這是我到目前爲止有:

def getFiletime(dt): 
    microseconds = int(dt)/10 
    seconds, microseconds = divmod(microseconds, 1000000) 
    days, seconds = divmod(seconds, 86400) 
    return datetime.datetime(1601, 1, 1) + datetime.timedelta(days, seconds, microseconds) 

我回去:

1601-01-02 14:37:23.520000 
1601-01-02 14:37:32.160000 
1601-01-02 14:37:40.800000 
1601-01-02 14:37:49.440000 
1601-01-02 14:37:58.080000 
1601-01-02 14:38:06.720000 
1601-01-02 14:38:15.360000 

任何想法?我只是從互聯網上覆制了getFiletime函數。我不認爲這是爲了我正在做的事情,但我知道它是在正確的軌道上。我嘗試在我的彈性搜索查詢中放入「格式」說明符,但不會像文檔狀態那樣以字符串的形式返回時間戳。任何幫助將不勝感激,並感謝您的閱讀!

+0

http://stackoverflow.com/a/13181415/538284 –

+0

我只是試過,沒有幫助,但無論如何謝謝。 – shady

+2

這些不是64位時間戳,只是常規(unix epoch)的毫秒分辨率:'datetime.utcfromtimestamp(1385942400000/1000.0).strftime('%Y-%m-%d')'給出了2013-12-02 ' – knutwalker

回答

0

我有相同的挑戰,並創建此方法來解決同樣的問題。

def to_es_date(d): 
    s = d.strftime('%Y-%m-%dT%H:%M:%S.') 
    s += '%03d' % int(round(d.microsecond/1000.0)) 
    s += d.strftime('%z') 
    return s 

它需要帶或不帶時區的日期時間,並返回ElasticSearch(v1.1.1確認)識別的字符串。我不確定是否需要填充,但看起來很謹慎。

In [5]: from datetime import datetime 

In [6]: import pytz 

In [7]: %paste 
def to_es_date(d): 
     s = d.strftime('%Y-%m-%dT%H:%M:%S.') 
     s += '%03d' % int(round(d.microsecond/1000.0)) 
     s += d.strftime('%z') 
     return s 

In [8]: to_es_date(datetime.now()) 
Out[8]: '2014-04-30T03:56:02.893' 

In [9]: to_es_date(datetime.now(tz=pytz.utc)) 
Out[9]: '2014-04-30T03:56:20.134+0000' 
0

這些都不是64位的時間戳,只需定期(Unix紀元)那些是毫秒級:

import datetime 
datetime.datetime.utcfromtimestamp(1385942400000/1000.).strftime('%Y-%m-%d') 

給出2013年12月2日

(感謝上面的@ knutwalker的評論)

相關問題