2017-09-05 20 views
-1

私はtxtを持っているとします。ファイルを条件付きでPythonでスライス

0 day0 event_data0 
    1 day1 event_data1 
    2 day2 event_data2 
    3 day3 event_data3 
    4 day4 event_data4 
    ........ 
    n dayn event_datan 

    #where: 
    #n is the event index 
    #dayn is the day when the event happened. year-month-day format 
    #event_datan is what happened at the event. 

このファイルから、2つの特定の日付の間に起こったすべてのイベントで新しいものを作成する必要があります。 2003年7月9日以降、2006年クリスマス前のように。 誰かが私にこの問題を教えてくれますか?とても有難い!

+1

あなたはこれを自分で解決しようとしましたか? –

答えて

0

datetimeモジュールがあなたの望むものです。現在の行の日付とあなたの始めの閾値日(あなたの例では2003年9月7日)の間のタイムディスタが正になるまで、行ごとにファイルを繰り返します。あなたがクリスマス2006に違反したときに反復を停止します。pandasデータフレームまたはnumpy配列のいずれかに行をロードします。

0

ルーカス、あなたはこれを試すことができます。

import re 
import os 
from datetime import datetime as dt 


__date_start__ = dt.strptime('2003-09-07', "%Y-%m-%d").date() 
__date_end__ = dt.strptime('2006-12-25', "%Y-%m-%d").date() 

f = open('file.txt', 'r').read() 
os.remove('events.txt') 

for i in f: 
    date = re.search('\d{4}\-\d{2}-\d{2}',i).group(0) 
    if date != '': 
     date_converted = dt.strptime(date, '%Y-%m-%d').date() 
     if (date_converted > __date_start__) and (date_converted < __date_end__): 
      open('events.txt', 'a').write(i) 

あなたはあなたの欲求間隔に__date_start____date_end__値を変更します、そして、コードが行に日付yyyy-mm-ddの形式と一致する正規表現を検索します。それで、範囲(日付の開始&の終わり)で比較するつもりであり、真の場合は、events.txtファイルに行の内容を追加します。

0

ファイルがタブ区切りであると仮定して、pandasパッケージを使用して読むことができます。 .txtファイルに列名(インデックス、日付、イベント)を含む最初の行をタブで区切って追加し、データを読み込みます。

df = pandas.read_csv('txt_file.txt', sep='\t', index_col=0) 
#index_col=0 just sets your first column as index 

これを実行したら、linkの手順に従います。これは基本的に、このパッケージを使用するだけで、2つの日付間でイベントを選択する方法に関する質問に答えます。そうすれば、必要なイベントだけで新しいデータフレームを返すことができます。

0

あなたは、「2006年9月7日以降、2006年クリスマス前」と特に言いたいとは書いていません。この2つの日付の他のオプションがありますか?

特に「2003年7月7日以降、2006年クリスマス前」の場合。私の意見では、正規表現モジュールで結果を得ることができます:

import re 
c=r"([0-9]{1,2}\s+)(2003-09-07).+(2006-12-25)\s+\w+" 
with open("event.txt","r") as f: 
    file_data=f.readlines() 
    regex_search=re.search(c,str(file_data)) 
    print(regex_search.group()) 

条件をgroup()で使用することも、findall()メソッドを使用することもできます。