2016-07-09 37 views
1

我有此格式的數據文件:閱讀年,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 

,我想在使用python閱讀。我首先使用awk將其轉換爲微秒,以便datetime模塊可以讀取數據但不能。數據讀取正常,但日期返回爲'南'。我也嘗試轉換爲秒和舍入到整數值和分鐘相同。我想也許我需要讀取數據,然後將毫秒更改爲小時:min:sec以使用日期時間,但如果有更好的方法或者我錯誤地使用日期時間,我想首先在此處查看。謝謝你的幫助!

這裏是我的代碼:

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是真的毫秒還是微秒,如標題?數據字段與最終日期時間有關嗎?看到我下面提供的答案。 – davedwards

+0

對不起,標題應該是毫秒,日期按年,doy和毫秒給出,最後一列是該日期的數據,例如降雨量,單位爲釐米或某物。您的解決方案仍然適用?謝謝你的幫助。 – Schro

+0

當然,感謝您的反饋,沒有問題,是的,我的答案創建日期時間只使用毫秒,我已編輯我的答案以反映輸出,我相信只有您可以確認答案是否仍然適用。樂意效勞! – 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是在一個文件中的數據。

+0

有沒有辦法做到這一點沒有熊貓包,而只是使用日期時間? – Schro

0

使用普通的老Python的datetime

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」,將是相同的。

反正,希望這會有所幫助!