2016-07-09 10 views
1

として私はこのような形式のデータファイルを持っている:私のpythonを使用して読みたいは年に読んで、DOYおよびマイクロ秒のデータは、日時

year doy milliseconds data 
2000 103 272220   1.123 
2000 103 373058   1.342 
2000 103 471764   0.743 
2000 103 573509   1.666 
2000 103 664624   1.736 
2000 103 758810   1.762 
2000 103 951634   1.888 
2000 103 1071637   1.444 
2000 103 1156676   1.001 

。私はまずdatetimeモジュールがデータを読むことができるようにawkを使ってマイクロ秒に変換しますが、それはできません。データは正常に読み込まれますが、日付は 'nan'として返されます。私はまた、秒に変換し、整数値に丸め、分を同じにしようとしました。多分私はデータを読み込み、ミリ秒を時間に変更する必要があると思います:datetimeを使うにはmin:secですが、より良い方法があるかどうか、またはdatetimeを間違って使用しているかどうかここで最初に確認します。ご協力いただきありがとうございます!ここで

は私のコードです:

datefunc = lambda x: mdates.date2num(datetime.datetime.strptime(x,'%Y %j %S')) 
data = np.genfromtxt(sat_filenames,delimiter=(13,10),converters={0:datefunc}, 
        names='Date, Var') 

私は仕事に「\ T」を得ることができませんでしたので、私は宇宙の数で区切り文字を述べるに頼っ - しかし、あなたができるなら、私に知らせて!

+0

タイトルのように、カラム3は実際にはミリ秒かマイクロ秒ですか? 'data'フィールドは最終日時に関係していますか?下の私の答えを見てください。 – davedwards

+0

タイトルはミリ秒でお願いします。日付はyear、doy、およびmillisecondsで、最後の列は降水量(cm単位など)です。あなたの解決策はまだ適用されますか?ご協力いただきありがとうございます。 – Schro

+0

あなたのフィードバックのためにありがとう、問題ありません、はい私の答えはミリ秒だけを使用してdatetimeを作成する、私は出力を反映するために私の答えを編集した、私はあなたが答えがまだ適用されるかどうかを確認することができます。助けてうれしい! – davedwards

答えて

0

使用pandas

import pandas as pd 
f = r"df2dt.txt" 
df = pd.read_csv(f, delim_whitespace=True) 
td_ms = pd.to_timedelta(df['milliseconds'], unit='ms') 
td_D = pd.to_timedelta(df['doy'] - 1, unit='D') 
date_str = df['year'].astype(str) 
date = pd.to_datetime(date_str, format="%Y", yearfirst=True) 
date_time = date + td_D + td_ms 
data = df['data'] 
print(date_time, data) 

df2dt.txtは、ファイル内のデータです。昔ながらのPythonのdatetimeを使用して

+0

pandasパッケージを使用せずにdatetimeを使用する方法がありますか? – Schro

0

import datetime 

dates = [] 

with open('datafile.txt','r') as fp: 
    fp.readline() 
    lines = fp.readlines() 

for line in lines: 
    line = line.rstrip('\n').split() 
    data = float(line[3]) 
    line = map(int, line[0:3]) 
    line.append(data) 
    dates.append(line) 

print '{0:<32}{1}'.format('datetime', 'data') 
for dt in dates: 
    date = datetime.datetime(dt[0], 1, 1) + datetime.timedelta(days=dt[1], milliseconds=dt[2]) 
    print '{0}\t{1}'.format(date, dt[3]) 

出力:

datetime     data 
2000-04-13 00:04:32.220000 1.123 
2000-04-13 00:06:13.058000 1.342 
2000-04-13 00:07:51.764000 0.743 
2000-04-13 00:09:33.509000 1.666 
2000-04-13 00:11:04.624000 1.736 
2000-04-13 00:12:38.810000 1.762 
2000-04-13 00:15:51.634000 1.888 
2000-04-13 00:17:51.637000 1.444 
2000-04-13 00:19:16.676000 1.001 

タイトルはマイクロ秒に言及し、まだ疑問がミリ秒を意味し、これに必要に応じてはtimedeltaに渡されたパラメータを変更します。また、質問にミリ秒が含まれているので、data列が何を参照しているか、または日付または時刻に含める方法がわかりませんでした。この回答に必要な出力に合わせて修正が必要な場合は、コメントに書き留めて更新します。それ以外の場合は、正確な出力を得るためにこれを変更するのはかなり簡単です。

pythonのネイティブdatetimeモジュールを使用しているコードは、パンダのソリューションとほぼ同じくらい簡潔で、読みやすいというだけでなく、コードがもっと「pythonic」だった場合も同じであることに注意してください。

とにかく、これが役立ちますように!

関連する問題