2016-01-21 91 views
0

我只是從Matlab切換到Python,並且想要學習如何使用loadtxtnumpy包中讀取Python中的此文件。 (我用textscanMatlab讀它)python loadtxt讀取分隔文件

"07220S006","14/01/12 01:59:50",10,"0" 

"07220S006","14/01/12 02:00:00",10,"0" 

"07220S006","14/01/12 02:00:10",10,"0" 

我能夠使用split功能Python正則表達式包讀然而,在這個文件,給我的數據包含約幾十萬像線這些應用於每一行的split函數將導致顯着的分析時間。所以我認爲loadtxt在這種情況下會做得更好。我發現了許多解決方案來讀取類似的文件,但這個文件比這些例子複雜得多,我不知道如何讀取它。

任何幫助和建議表示讚賞

+0

genfromtxt比numpy中的loadtxt更健壯 – mauve

+0

感謝您的建議。我會花更多的時間來檢查這個功能,因爲我的第一次嘗試並沒有回到我想要的結果。 – will1009

回答

1

你可以做到這一點與pandas容易,然後如果你需要numpy數組,你可以訪問values

import pandas as pd 
from io import StringIO 

data = """ 
"07220S006","14/01/12 01:59:50",10,"0" 
"07220S006","14/01/12 02:00:00",10,"0" 
"07220S006","14/01/12 02:00:10",10,"0" 
""" 

df = pd.read_csv(StringIO(data), header=None) 

print(df) 
      0     1 2 3 
0 07220S006 14/01/12 01:59:50 10 0 
1 07220S006 14/01/12 02:00:00 10 0 
2 07220S006 14/01/12 02:00:10 10 0 


print(df.values) 
array([['07220S006', '14/01/12 01:59:50', 10, 0], 
     ['07220S006', '14/01/12 02:00:00', 10, 0], 
     ['07220S006', '14/01/12 02:00:10', 10, 0]], dtype=object) 

編輯

IUUC你想要將日期列分割爲日期和時間(或者到年份,月份等)/您可以先將該列轉換爲datetime對象與pd.to_datetime再接入領域與datetimedt,並將其寫入到新列:

date_col = pd.to_datetime(df[1]) 
date_col.dt.year 
print(date_col.dt.year) 
0 2012 
1 2012 
2 2012 
Name: 1, dtype: int64 

或者,如果你想要的任何與dt.strftime,你可以將其轉換字符串,如:

print(date_col.dt.strftime("%Y/%m %H:%M")) 
0 2012/01 01:59 
1 2012/01 02:00 
2 2012/01 02:00 
Name: 1, dtype: object 

您可以創建非常容易,因爲:

df['year'] = date_col.dt.year 

print(df) 
      0     1 2 3 year 
0 07220S006 14/01/12 01:59:50 10 0 2012 
1 07220S006 14/01/12 02:00:00 10 0 2012 
2 07220S006 14/01/12 02:00:10 10 0 2012 
+0

感謝您的回答。這幾乎是我正在尋找的。然而,當我按照你的指示,第二欄是'14/01/12 01:59:50 \ n '14/01/12 02:00:00'\ n 14/01/12 02:00:10'這是一個numpy的ndarray類型,我不能在這種類型的數據上應用loadtxt或genfromtxt。有什麼辦法可以將該列分割並將值分配到日,月,年,小時,分鐘和秒鐘向量中。謝謝 – will1009

+0

太棒了。非常感謝您的幫助。它的工作 – will1009

+0

@ will1009很高興它有幫助。如果您對解決方案感到滿意,您可以將其標記爲已接受。 –

0

將引號中的任何值視爲字符串,並使用numpy.genfromtxt instea d(在缺失值處理越好):使用numpy的去除引號的簡單方式

import numpy as np 
from StringIO import String IO 

example_data = '"07220S006","14/01/12 01:59:50",10,"0"\n"07220S006","14/01/12 02:00:00",10,"0"\n"07220S006","14/01/12 02:00:10",10,"0"' 
# approximation of your input data 

data = np.genfromtxt(StringIO(example_data), delimiter=',', dtype='S16,S16,i4,S3') 
# dtypes: Sx - x char string, i4 - 32 bit integer 
# more here: http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html 

print data 
[('"07220S006"', '"14/01/12 01:59:50"', 10, '"0"') 
('"07220S006"', '"14/01/12 02:00:00"', 10, '"0"') 
('"07220S006"', '"14/01/12 02:00:10"', 10, '"0"')] 

不能相信,我想在上面用大熊貓的帖子可能會是一個更好的解決方案或蟒蛇CSVReader

+0

感謝您的幫助。知道genfromtxt加載txt文件是很好的。 – will1009