2014-04-18 3 views
1

파일에서 시간 문자열과 데이터를 읽고 싶지만 loadtxt을 사용하면 문자열이 부동 상태가 아니기 때문에 문자열과 숫자를 동시에 읽을 수 없습니다. 그래서 나는 genfromtxt을 사용하고 delimiter=[]+[]+[] 내가 가지고있는 열을 지정하여 사용했지만 문자열은 nan처럼 읽혀집니다. 나는 시간 배열 (date2num, datetime 또는 이와 유사한)을 올바른 형식으로 matplotlib에 플롯 할 수있는 시간을 직접 읽고 싶습니다. 그래서 내가 무엇을 할 수 있니? 제안에 따라파일에서 날짜와 데이터 읽기 (파이썬)

GOES data for time interval: 20-Feb-2014 00:00:00.000 to 27-Feb-2014 00:00:00.000 
Current time: 23-Mar-2014 21:52:00.00 

Time at center of bin  1.0 - 8.0 A 0.5 - 4.0 A Emission Meas   Temp 
           watts m^-2  watts m^-2 10^49 cm^-3    MK 
20-Feb-2014 00:00:00.959  4.3439e-006 3.9946e-007  0.30841   10.793 
20-Feb-2014 00:00:02.959  4.3361e-006 3.9835e-007  0.30801   10.789 
20-Feb-2014 00:00:04.959  4.3413e-006 3.9501e-007  0.30994   10.743 
20-Feb-2014 00:00:06.959  4.3361e-006 3.9389e-007  0.30983   10.735 
20-Feb-2014 00:00:08.959  4.3361e-006 3.9278e-007  0.31029   10.722 
20-Feb-2014 00:00:10.959  4.3387e-006 3.9278e-007  0.31058   10.719 
20-Feb-2014 00:00:12.959  4.3361e-006 3.9278e-007  0.31029   10.722 
20-Feb-2014 00:00:14.959  4.3361e-006 3.9055e-007  0.31122   10.695 
20-Feb-2014 00:00:16.959  4.3334e-006 3.8721e-007  0.31234   10.657 

, 내가 사용하여 데이터를 읽어 : 나는 아래 마일 목록을두고 (물론, 그것은 더 많은 데이터를 'S)

pd.read_csv('/filename',sep='\s\s+',header=5, 
       names=['time','band1','band2','emeas','temp']) 

을 내가 데이터를 읽을 수있어,하지만 단지 문제, 인쇄 할 때 데이터가 나타납니다.

     time  band1 band2 emeas temp 
0 20-Feb-2014 00:00:03.005 0.000004  0 0.31000 10.866 
1 20-Feb-2014 00:00:05.052 0.000004  0 0.31199 10.819 
2 20-Feb-2014 00:00:07.102 0.000004  0 0.31190 10.811 
3 20-Feb-2014 00:00:09.149 0.000004  0 0.31237 10.798 
4 20-Feb-2014 00:00:11.199 0.000004  0 0.31266 10.795 
5 20-Feb-2014 00:00:13.245 0.000004  0 0.31237 10.798 
6 20-Feb-2014 00:00:15.292 0.000004  0 0.31334 10.770 
7 20-Feb-2014 00:00:17.342 0.000004  0 0.31451 10.732 
8 20-Feb-2014 00:00:19.389 0.000004  0 0.31451 10.732 
9 20-Feb-2014 00:00:21.439 0.000004  0 0.31421 10.735 

따라서 분명히 band1과 band2의 데이터가 반올림되었습니다. 사실, 플롯 할 때 정확한 (둥근 모양이 아닌) 것처럼 보이지만 프레임에서 그 모양이 왜 보이는지.

+0

f = open ('** path/to/file/here **')을 사용하고 split() 또는 regexp – w5e

+0

http://pymotw.com/2/re/ <- is good for regexp – w5e

+0

@Tweek, 좋은 예가 될 수 있습니다. – nandhos

답변

1

당신은 pandas.read_csv()를 사용할 수 있습니다. 그런 다음 :

import pandas as pd 

pd.read_csv('test.txt', sep='\s\s+', header=4) 

을 얻을 수 있습니다.

+0

Thanks @Saullo 나는 당신의 제안처럼 판다를 사용했다. 제 질문은 위에 편집되었습니다. sep = '\ s \ s +''2 개 이상의 공백이있는 공간을 의미합니다. 'sep ='s * '는 어떤 공백을 가진 공백을 의미합니까? – nandhos

+0

@nandhos가 맞지만 모든 길이 (0 포함)는 'sep ='\ s * ''이어야합니다. –

+0

고마워요 @Saullo, 왜 하나 이상입니까? 왜 위의 코드를 사용하여 읽을 때, band1 band2는 반올림 된 것처럼 보입니까? 실제로 내가이 데이터를 작곡 할 때 그것은 아주 작습니다. 단지 인쇄 할 때만 위의 프레임을 보여주는 것입니다. – nandhos

1

정규 표현식을 사용하면 좀 더 세련된 해결책이 될 수 있지만이 방법도 효과적입니다. sep 매개 변수 (numpy.genfromtxtdelimiter에 equivalend가) 정규 표현식을 허용하기 때문에

from datetime import datetime 

input_file = open("path/filename") 
for line in input_file: 
    line_parts = line.split() 
    if len(line_parts) > 1: 
     try: 
      # This is now a datetime object 
      timestamp = datetime.strptime(line_parts[0] + " " + line_parts[1], "%d-%b-%Y %H:%M:%S.%f") 
      # Do stuff with data here (each stored seperately in line_parts list) 
      # For instance printing everything. 
      print("DateTime Object: " + str(timestamp)) 
      print("Data: " + str(line_parts[2:])) 

      # Cast data to floats for use in arithmetic 
      data_point_one = float(line_parts[2]) 
      print ("data_point_one * 2 = " + str(data_point_one * 2)) 

     except ValueError: 
      # Lines that don't start with a timestamp take this route... 
      continue 
+0

맞습니다. 문자열과 같이 날짜와 시간을 읽었지 만 숫자 (데이터)도 문자열입니다. 부동이어야합니다. – nandhos

+0

부동 소수점 형으로 캐스팅 할 수 있습니다. 위 응답을 편집하여 방법을 보여줍니다. –