簡體   English   中英

使用genfromtxt讀取csv / txt文件,同時分隔數字和日期時間的值

[英]read csv/txt file with genfromtxt while separating values for numbers and datetime

我拼命試圖讀取和轉換txt文件,如下所示:

file.txt


Line,Date Time,Celsius(°C),Humidity(%rh),Dew Point(°C),Serial Number
1,10-06-2013 18:25:00,24.0,48.5,12.5,990121703
2,10-06-2013 18:30:00,24.0,48.0,12.3
3,10-06-2013 18:35:00,23.5,48.5,12.0
4,10-06-2013 18:40:00,23.5,49.0,12.2
5,10-06-2013 18:45:00,23.5,49.0,12.2
6,10-06-2013 18:50:00,23.5,49.0,12.2
7,10-06-2013 18:55:00,23.5,49.0,12.2
...

我已經能夠使用以下方法將所有數值讀入變量中:

from pylab import *
from datetime import datetime
fname ='LOG.txt'
n0,DT1,T2,H3,DP4 = genfromtxt(fname,delimiter=',', skip_header=1, skip_footer=0,usecols=(0,1,2,3,4), autostrip=True, unpack=True, invalid_raise=True)

但是,“ date_time”列(列1)未顯示為單獨的變量,也未返回任何錯誤消息。

我想將事物轉換為以下變量:

n0   = 0 column as 'u4'<br>
DT1  = 1st column converted such that `datetime.strptime('10-06-2013 18:25:01', '%d-%m-%Y %H:%M:%S')`<br>
T2   = 2nd column as 'f4'<br>
H3   = 3rd column as 'f4'<br>
DP4  = 4th column as 'f4'<br>

我發現了幾個使用genfromtxt,dtype和strptime的示例,但是我沒有一個適用於這種特定情況。

對新手有什么建議嗎?

_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __
_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

編輯(24-07-2013):

我找到了一種可能的解決方案,足以滿足我的需求:

from pylab import *
import datetime as DT

def make_date(datestr):
    return DT.datetime.strptime(datestr, '%d-%m-%Y %H:%M:%S')

data1 = genfromtxt(fname, delimiter = ',',
                skip_header=1,skip_footer=0,usecols = (0,1,2,3,4), # usecols (0..4) is required due to the serial number present in second row only 
                converters = {'Date':make_date},
                names =  ('Line', 'Date', 'Temperature', 'Humidity','DewPoint'),
                dtype = None,
                invalid_raise=True) # dtype = None takes care of all data type but the one sent to converters

# Console output:
print(data1)
print(data1.dtype)

#Temperature Graph:
figure(1)
plot(data1['Date'],data1['Temperature'],'-xb')
grid('on')
ylabel('Temperature (degC)',fontsize=10)
xlabel('Date',fontsize=10)


返回:

[(1, datetime.datetime(2013, 6, 10, 18, 25), 24.0, 48.5, 12.5)
(2, datetime.datetime(2013, 6, 10, 18, 30), 24.0, 48.0, 12.3)
(3, datetime.datetime(2013, 6, 10, 18, 35), 23.5, 48.5, 12.0) ...,
(12298, datetime.datetime(2013, 7, 23, 11, 10), 23.5, 43.5, 10.4)
(12299, datetime.datetime(2013, 7, 23, 11, 15), 23.5, 43.5, 10.4)
(12300, datetime.datetime(2013, 7, 23, 11, 20), 23.5, 43.5, 10.4)]
[('Line', '<i4'), ('Date', 'O'), ('Temperature', '<f8'), ('Humidity', '<f8'), ('DewPoint', '<f8')]


現在,也許有人可以幫助我達到:

n0,DT1,T2,H3,DP4 = genfromtxt(fname,...,unpack=True)

其中DT1包含:

datetime.datetime(2013, 6, 10, 18, 25)


謝謝你的幫助

您的方法已經非常好,它提供了一個結構化的數組,您可以使用operator.itemgetter從中獲取字段:

names = ('Line', 'Date', 'Temperature', 'Humidity','DewPoint')

from operator import itemgetter
n0, DT1, T2, H3, DP4 = itemgetter(*names)(data1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM