2014-10-07 55 views
1

我需要在一段時間內製作事件的直方圖。我的數據集爲我提供了格式爲ex的每個事件的時間。 2013-09-03 17:34:04,我如何將它轉換成我可以在Python直方圖中繪製的東西? 我知道如何用datetime和time命令來完成它。從日期時間到可用值Python

通過我的數據集包含了上面1.500.000數據點的方式,因此請只可通過循環或類似的東西進行自動化解決方案;)

回答

0

使用time.strptime()爲本地時間字符串轉換爲time.struct_time然後time.mktime() ,它會將time.struct_time轉換爲自1970-01-01 00:00:00,UTC以來的秒數。

#! /usr/bin/env python 

import time 

def timestr_to_secs(timestr): 
    fmt = '%Y-%m-%d %H:%M:%S' 
    time_struct = time.strptime(timestr, fmt) 
    secs = time.mktime(time_struct) 
    return int(secs) 

timestrs = [ 
    '2013-09-03 17:34:04', 
    '2013-09-03 17:34:05', 
    '2013-09-03 17:35:04', 
    '1970-01-01 00:00:00' 
] 

for ts in timestrs: 
    print ts,timestr_to_secs(ts) 

我在時區+10,輸出上面的代碼給我的是:

2013-09-03 17:34:04 1378193644 
2013-09-03 17:34:05 1378193645 
2013-09-03 17:35:04 1378193704 
1970-01-01 00:00:00 -36000 

當然,對於直方圖的製作目的,您可能希望從減去一個方便的基準時間這些數字。


這是一個更好的版本,受到J. F. Sebastian評論的啓發。

#! /usr/bin/env python 

import time 
import calendar 

def timestr_to_secs(timestr): 
    fmt = '%Y-%m-%d %H:%M:%S' 
    time_struct = time.strptime(timestr, fmt) 
    secs = calendar.timegm(time_struct) 
    return secs 

timestrs = [ 
    '2013-09-03 17:34:04', 
    '2013-09-03 17:34:05', 
    '2013-09-03 17:35:04', 
    '1970-01-01 00:00:00' 
] 

for ts in timestrs: 
    print ts,timestr_to_secs(ts) 

輸出

2013-09-03 17:34:04 1378229644 
2013-09-03 17:34:05 1378229645 
2013-09-03 17:35:04 1378229704 
1970-01-01 00:00:00 0 

每當我想到這一點可以從使用本地時間()我提醒的是,發生在我許多朋友這個典型的例子中出現的問題多年前。

作爲FidoNet C_ECHO的定期撰稿人的程序員曾爲啤酒廠編寫過程控制代碼。不幸的是,他的代碼使用localtime()而不是gmtime(),這在釀酒廠計算機在夏令時結束時自動調整時鐘時會產生意想不到的後果。那天早上,當地時間凌晨2點發生了兩次。所以他的程序重複了這個過程,它已經在第一次凌晨2點左右滾動了,這是爲了開始填充啤酒原料的大缸。你可以想象,釀酒廠的地板是一團糟。 :)

+0

'mktime()'可能會失敗的曖昧時間(期間結束DST轉換)和過去的日期,如果當地時區的UTC偏移量在當時是不同的,並且不使用歷史時區數據庫(Windows)。 – jfs 2014-10-13 00:54:38

+0

非常好的一點,@ J.F.Sebastian。當我編寫上面的代碼時,我無法在時間模塊文檔中找到與'gmtime()'相反的內容,但仔細閱讀後,我發現在日曆模塊中,所有地方都隱藏了一個代碼。 – 2014-10-13 04:36:19

+0

這不是我的意思。 'timegm()'預計UTC時間。輸入時間可能在當地時區。 – jfs 2014-10-13 04:53:20

0

要處理數以百萬計分的時間序列,你可以嘗試pandas

#!/usr/bin/env python 
from io import StringIO 
import matplotlib.pyplot as plt # $ pip install matplotlib 
import pandas as pd 

csv_file = StringIO(u"""time,A,B 
2013-09-03 17:34:04,1,2 
2013-09-03 17:34:05,3,4 
2013-09-03 17:34:10,4,5 
""") 
df = pd.read_csv(csv_file, parse_dates=True, index_col='time') 
df = df.cumsum() 
df.plot() 
plt.show()