2013-06-26 45 views
1

我有了在它的值這樣的數據文件:如何在一個.txt數據文件中解釋值時間序列

@年月日HH MN SS HS HRMS HMA X Tz的TS鍀THMAX ep S銀T0 2個TP HRMS EPS

29 11 2000 13 17 56 2.44 1.71 3.12 9.12 11.94 5.03 12.74 0.83 8.95 15.03 1.80 0.86
29 11 2000 13 31 16 2.43 1.74 4.16 9.17 11.30 4.96 11.70 0.84 8.84 11.86 1.80 .87

我用下面的方法得到數據:

infile = open ("testfile.txt", 'r') 
data = np.genfromtxt(infile,skiprows=2) 

,給了我一個numpy.ndarray

我希望能夠解釋第0-5列作爲一個時間戳(DD:MM:YYY:HH:MN:SS ),但這是我陷入困境的地方 - 似乎有一百萬種方法可以做到,我不知道什麼是最好的。

我一直在尋找dateutil和熊貓 - 我知道有一些盲目顯而易見的東西我應該做,但不知所措。我應該先轉換成csv格式嗎?以某種方式使用for循環連接每行(cols 0-5)的值?

在此之後,我會根據時間戳/增量繪製其他列的值。

我完全新的Python,所以任何指針讚賞:)

+0

「似乎是一個百萬種方式來做到這一點,我不知道什麼是最好的「到目前爲止,你到底做了什麼?它如何失敗?爲什麼這不夠? –

回答

2

這裏是爲您pandas解決方案:

測試。CSV:

29 11 2000 13 17 56 2.44 1.71 3.12 9.12 11.94 5.03 12.74 .83 8.95 15.03 1.80 .86 
29 11 2000 13 31 16 2.43 1.74 4.16 9.17 11.30 4.96 11.70 .84 8.84 11.86 1.80 .87 

pandas提供read_csv UTIL用於讀取CSV,你應該給下面的參數分析文件:

  1. 分隔符:默認的是逗號,所以你需要設置作爲一個空間
  2. parse_dates:那些日期列(順序敏感)
  3. date_parser:默認爲dateutil.parser.parse,但看來它不適合你的情況下工作,所以你應該實現自己的解析器
  4. 頭:如果您的CSV沒有列名,你應該把它設置爲None

最後,這裏的示例代碼:

In [131]: import datetime as dt 

In [132]: import pandas as pd 

In [133]: pd.read_csv('test.csv', 
         parse_dates=[[2,1,0,3,4,5]], 
         date_parser=lambda *arr:dt.datetime(*[int(x) for x in arr]), 
         delimiter=' ', 
         header=None) 
Out[133]: 
      2_1_0_3_4_5  6  7  8  9  10 11  12 13 14 \ 
0 2000-11-29 13:17:56 2.44 1.71 3.12 9.12 11.94 5.03 12.74 0.83 8.95 
1 2000-11-29 13:31:16 2.43 1.74 4.16 9.17 11.30 4.96 11.70 0.84 8.84 

     15 16 17 
0 15.03 1.8 0.86 
1 11.86 1.8 0.87 
0

我幾乎知道numpy的東西,但你可以使用datetime模塊將日期轉換爲日期對象:

import datetime 
line = "29 11 2000 13 17 56 2.44 1.71 3.12 9.12 11.94 5.03 12.74 .83 8.95 15.03 1.80 .86" 
times = line.split()[:6] 

現在,從這裏你有兩個選擇:

print ':'.join(times) 
# 29:11:2000:13:17:56 

或者,正如我之前所說的,使用datetime模塊:

mydate = datetime.datetime.strptime(':'.join(times), '%d:%m:%Y:%H:%M:%S') 
print datetime.datetime.strftime(mydate, '%d:%m:%Y:%H:%M:%S') 
# 29:11:2000:13:17:56 

當然,你可能認爲第二個選項是無用的,但如果你想從日期(即年份)獲得更多信息,那麼最好將它轉換爲日期時間對象。

1

這是我會怎麼做:

from datetime import datetime 

# assuming you have a row of the data in a list like this 
# (also works on ndarrays in numpy, but you need to keep track of the row, 
# so let's assume you've extracted a row like the one below...) 
rowData = [29, 11, 2000, 13, 17, 56, 2.44, 1.71, 3.12, 9.12, 11.94, 5.03, 12.74, 0.83, 8.95, 15.03, 1.8, 0.86] 

# unpack the first six values 
day, month, year, hour, min, sec = rowData[:6] 
# create a datetime based on the unpacked values 
theDate = datetime(year,month,day,hour,min,sec) 

無需將數據轉換爲字符串和解析。可能會檢查出datetime documentation

0
import datetime 
import re 

import numpy as np 

def convert_to_datetime(x): 
    return datetime.datetime.strptime(x, '%d:%m:%Y:%H:%M:%S') 

infile = open("testfile.txt", 'r') 
infile = (re.sub(r'^(\d+) (\d+) (\d+) (\d+) (\d+) (\d+)', r'\1:\2:\3:\4:\5:\6', line, 1) for line in infile) 
data = np.genfromtxt(infile, skiprows=2, converters={0: convert_to_datetime})