2011-12-23 22 views
1

我最近(1周)決定將我的工作從matlab遷移到Python。由於我習慣了matlab,所以我發現有時難以獲得我想要在python中完成的任務。如何將日期數組(格式'mm/dd/yh H:MM:SS')轉換爲數字?

這裏是我的問題:

我有一組的,我要處理的CSV文件。到目前爲止,我已經成功地將它們加載到組中。每列的大小爲600000 x 1.在csv文件的其中一列中,格式爲「mm/dd/y HH:MM:SS」的時間。我想將時間列轉換爲數字,我使用的是matplot lib中的date2num。有一種「矩陣」的方式嗎?在matlab中這樣做的命令是datenum(time,'mm/dd/yyyy HH:MM:SS'),其中時間是600000 x 1矩陣。

感謝

這是我講的代碼示例:

import csv 
import time 
import datetime from datetime 
import date from matplotlib.dates 
import date2num 

time = [] 
otherColumns = [] 

for d in csv.DictReader(open('MyFile.csv')): 
     time.append(str(d['time'])) 
     otherColumns.append(float(d['otherColumns'])) 

timeNumeric = date2num(datetime.datetime.strptime(time,"%d/%m/%y %H:%M:%S")) 
+3

你可能會發現http://www.scipy.org/NumPy_for_Matlab_Users非常有用。 – mtrw 2011-12-23 23:36:39

+0

['pandas.io.parsers.read_csv()'](http://pandas.sourceforge.net/io.html)可能有幫助 – jfs 2011-12-24 10:42:33

回答

0

你可以使用一個發電機:

def pre_process(dict_sequence): 
    for d in dict_sequence: 
     d['time'] = date2num(datetime.datetime.strptime(d['time'],"%d/%m/%y %H:%M:%S")) 
    yield d 

現在你可以處理您的csv:

for d in pre_process(csv.DictReader(open('MyFile.csv'))): 
    process(d) 

這種解決方案的優點是它不會複製可能很大的序列。

編輯:

所以你的文件在numpy的數組的內容?

reader = csv.DictReader(open('MyFile.csv')) 
#you might want to get rid of the intermediate list if the file is really big. 
data = numpy.array(list(d.values() for d in pre_process(reader))) 

現在你有一個不錯的大陣列,可以進行各種操作。你只想要第一列得到你的600000x1矩陣:

data[:,0] # assuming time is the first column 
+0

謝謝。我試過這個解決方案,但是這隻給了我一個數字時間,大小爲1x1。我想要做的是在數字時間內有一個600000x1的數組,以便我可以使用numpy/scipy來執行必要的矩陣操作。謝謝。 – mikeP 2011-12-24 01:25:58

+0

非常感謝。這解決了我的問題。 – mikeP 2011-12-24 13:17:35

+0

你介意upvote我的答案並將其標記爲已解決? – tback 2011-12-24 13:55:59

0

在Python最接近的事了MATLAB的矩陣/矢量操作列表理解。如果你想在一個列表中的每一項應用Python函數,你可以這樣做:

new_list = [date2num(data) for data in old_list] 

new_list = map(date2num, old_list) 
相關問題