2016-05-05 1 views
-3


私はPythonを初めて使用しています。しかし、私のデータ処理で使用する練習で学ぶ。特定の列を処理するためにテキストファイルをインポートします。

ここに示すような形式の大きなデータファイルがあります。
行数と列数が常に不明です。この例では、2つの連続した行が示されています。
第1列は「時間」であり、第n列は識別器(第1行の「abc」)から選択される関連データです。

................
"2013年1月1日夜12時00分02秒" 228 227 15.65 15.84 14.85 14.68 14.53 13.75 12.45 12.55
"2013年1月2日0時01分03秒" 225 227 16.35 15.99 14.85 14.73 14.43 13.8 12.85 13.2
................

所望の出力as

  1. Column1 =時間の点で、時間差は と計算されます。
  2. column(n)=さらに処理されるデータは、 floatである必要があります。

私の過去の試行では、私はリストになってしまうので、どちらの列も変換できません。

過去の質問と回答を検索しようとしました。しかし、私は初心者なので、すべてを解釈できませんでした。私はあなたの迅速な助けが後で処理するように、データを列形式で読むことを期待しています。私はそれがより多くの数学的操作であるので、さらなる処理に注意を払うことができると信じています。

本当に助けていただきありがとうございます。

よろしく
Gouri

補正1:
私は以前に、必要に応じて列を抽出するコンパクトバージョンを与えるパンダを理解しました。グループからの提案後の良い学習。次のように
コードは次のようになります。

import pandas as pd 
data = pd.read_csv(fp, sep='\t') 
entry=[] 
entry = data['u90'] 
print entry, '\n', entry[5] 

out_file = open("out.txt", "w") 
entry.to_csv(out_file) 

よろしく
Gouri

+0

これは非常に頻繁に尋ねられる質問です。たとえば、[pandas](http://pandas.pydata.org/pandas-docs/stable/io.html)を使用してデータを読んでください。 – Deusdeorum

+0

Pythonの新機能コーディング、パンダは理解するのが少し複雑だと思われる。私はこれを私のさらなる練習のために保つつもりです。そしてこれも私の任務の一部です。したがって、簡単なコードの練習で早く解決することを楽しみにしています。とりわけ、提案に感謝します。 – Gouri

+0

ヒューゴの提案によると、私はパンダとその非常に効率的なものを試しました。 – Gouri

答えて

0

コメントにヒューゴHonoremで指摘したように、あなたがpandasを使用することができます。

プロジェクトに多くの依存関係を導入したくない場合は、このような関数を使用できます。

from operator import itemgetter 

def load_dataset(fp, columns, types=None, delimiter=' ', skip_header=True): 
    get_columns = itemgetter(*columns) 
    if skip_header: 
     next(fp) 
    dataset = [] 
    for line in fp: 
     parts = line.split(delimiter) 
     columns = get_columns(parts) 
     if types is not None: 
      columns = [convertor(col) for convertor, col in zip(types, columns)] 
     dataset.append(columns) 
    return dataset 

columns整数のリストである必要があり、typesはへの所望の列を変換する呼び出し可能オブジェクトのリストですあなたがそれらになりたいタイプ。浮動小数点の場合は、floatを渡して、あなたの日付では、カスタムto_dateの機能を渡すことができます。

1

あなたは正規表現を使用することに興味を持っている、とないパンダ場合は、データセットは、次のコードの作品のために。

import re 

#l1 = ["\"2013-01-01 00:00:02\" 228 227 15.65 15.84 14.85 14.68 14.53 13.75 12.45 12.55", 
#"\"2013-01-02 00:01:03\" 225 227 16.35 15.99 14.85 14.73 14.43 13.8 12.85 13.2"] 

l1 = """"2013-01-01 00:00:02\" 228 227 15.65 15.84 14.85 14.68 14.53 13.75 12.45 12.55 
"2013-01-02 00:01:03\" 225 227 16.35 15.99 14.85 14.73 14.43 13.8 12.85 13.2""" 

l_match = re.findall(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\"\s\d+\s\d+\s\d+\.\d+\s(\d+\.\d+)',l1) 

if l_match: 
    for each_find in l_match: 
     l_date = each_find[0] 
     l_number = float(each_find[1]) 
     print l_date 
     print l_number 

出力

2013-01-01 00:00:02 
15.84 
2013-01-02 00:01:03 
15.99 
+0

パンダを使用した後、私は他のエントリと時刻を '2013-01-01 00:00:00'、 '2013-01-01 00:00:01'などのように列の配列に取得できます。私は、これらの値を基準時間(「2013-01-01 00:00:00」の例として)を差し引いて秒単位で変換したいと考えています。これにより、改訂されたデータは0、1、.....(秒単位)になります。助けてください。 – Gouri

0

あなたが持っているものは、空白を区切り文字として含むCSVファイルです。そのため、CSVライブラリ(https://docs.python.org/2/library/csv.html)を使用できます。 Nは、あなたの値が配置されている列である場合はそうでない場合、あなたは)(

f = open('myfile.csv','r') 
for line in f.readlines(): 
    date = line.split(' ')[0] 
    value = line.split(' ')[N] 

を行ずつ読み込み、分割して解析することができます(あなたの例では、4)。

しかし、私は強くパンダをお勧めします。あなたのコード品質を次のレベルに引き上げます。

+0

このコードは、 'date = line.split(' \ t ')[0]'という小さな変更から始めると問題なく動作します。 – Gouri

関連する問題