2017-04-06 52 views
2

我有不同的數據集,其中一些數據是5分鐘/ 15分鐘或30分鐘的時間間隔。有100個這樣的文件(以不同的格式 - .dat,.txt,.csv等) 我想用Python過濾掉所有這些文件中的小時數據。我是使用熊貓的新手,雖然我正在嘗試學習圖書館,但任何幫助都會受到很大的關注。每小時過濾數據python

Date  Time Point_1 
27/3/2017 0:00:00 13.08 
27/3/2017 0:05:00 12.96 
27/3/2017 0:10:00 13.3 
27/3/2017 0:15:00 13.27 
27/3/2017 0:20:00 13.15 
27/3/2017 0:25:00 13.14 
27/3/2017 0:30:00 13.25 
27/3/2017 0:35:00 13.26 
27/3/2017 0:40:00 13.24 
27/3/2017 0:45:00 13.43 
27/3/2017 0:50:00 13.23 
27/3/2017 0:55:00 13.27 
27/3/2017 1:00:00 13.19 
27/3/2017 1:05:00 13.17 
27/3/2017 1:10:00 13.1 
27/3/2017 1:15:00 13.06 
27/3/2017 1:20:00 12.99 
27/3/2017 1:25:00 13.08 
27/3/2017 1:30:00 13.04 
27/3/2017 1:35:00 13.06 
27/3/2017 1:40:00 13.07 
27/3/2017 1:45:00 13.07 
27/3/2017 1:50:00 13.02 
27/3/2017 1:55:00 13.13 
27/3/2017 2:00:00 12.99 
+0

嗨,你這是什麼意思過濾出來?你想按小時進行彙總嗎?也許是伯爵? –

回答

1
import pandas as pd 

df = pd.read_table('sample.txt', delimiter='\s+') # Your sample data 
df['dt'] = pd.to_datetime(df['Date'] + ' ' + df['Time']) 

print df.set_index('dt').resample('1H').asfreq().reset_index(drop=True) 


     Date  Time Point_1 
0 27/3/2017 0:00:00 13.08 
1 27/3/2017 1:00:00 13.19 
2 27/3/2017 2:00:00 12.99 
+0

我想我得到了一些意想不到的結果。之前我使用df.resample('1H')last(),而且我只是在最後一天得到了幾個小時,但現在我嘗試使用所有的解決方案,並且我只得到(1)僅第一天(24小時)或(2)僅限最後一天(24小時)或(3)僅限第一天和最後一天(48小時)。在所有值之間都由NaN填充。我不知道如何重新採樣我的所有數據,而不僅僅是首先或最後一次。我對那些正在重新取樣的NaN –

+0

@jezrael數據值:這是我的數據重新取樣 23 2016年1月1日23:00:00 4753.00 15.7 23.5 372.3 25 2016年1月2日01後的樣子: 00:00在中的的 ... ... ... ... ... 8036 2016年11月30日20 2016年1月2日02:00:00 26: 00:00在在在在8038 二零一六年十一月三十零日22:00:00的8037 二零一六年十一月三十零日21:00:00在 8039二零一六年十一月三十零日23:00: 00中 8040 2016年12月1日00:00:00 4811.96 14.8 24.8 364.3 –

0

這是一個類似於你搭售做什麼。這適用於csv文件,並且也適用於.txt文件。如果所有的數據都是相同的順序,你可以很容易地寫一個for循環來增加一個計數,當它達到13時,將該值放入xaxis列表中。但是,如果您的數據不是按照5分鐘遞增的增長模式進行操作,您需要按照其他指標對其進行排序,以便爲您節省頭痛。這很容易在matplotlib中使用pythons排序功能來完成。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html

#opens the file and reads in the raw data and 
#cleans up data so it is readable 
file=open("file_name","r") 
data=file.read() 
data=data.replace(" ",",") 
#when reading in the data the 3rd index saved a 
#value \r so this is necessary to use a float type 
data=data.split("\r") 
#x and y axis dictionary 
xaxis = [] 
#for loop for getting the time and 
for index in range(0,len(data)): 
xaxis=data[index][0] 
#if data is in range remove data that has a divide by 0 error 
for index in range(0, len(data)): 
    if len(data[index]) == 0: 
    del(data[index]) 
    continue 
for index in range(0,len(data)): 
print "lines",index, "-",data[index] 
data[index]=data[index].split(",") 
data[index][1]=int(data[index][1]) 
2

可以使用read_csv與參數parse_dates的轉換列datetimedatetime第一:

import pandas as pd 
from pandas.compat import StringIO 

temp=u"""Date  Time Point_1 
27/3/2017 0:00:00 13.08 
27/3/2017 0:05:00 12.96 
27/3/2017 0:10:00 13.3 
27/3/2017 0:15:00 13.27 
27/3/2017 0:20:00 13.15 
27/3/2017 0:25:00 13.14 
27/3/2017 0:30:00 13.25 
27/3/2017 0:35:00 13.26 
27/3/2017 0:40:00 13.24 
27/3/2017 0:45:00 13.43 
27/3/2017 0:50:00 13.23 
27/3/2017 0:55:00 13.27 
27/3/2017 1:00:00 13.19 
27/3/2017 1:05:00 13.17 
27/3/2017 1:10:00 13.1 
27/3/2017 1:15:00 13.06 
27/3/2017 1:20:00 12.99 
27/3/2017 1:25:00 13.08 
27/3/2017 1:30:00 13.04 
27/3/2017 1:35:00 13.06 
27/3/2017 1:40:00 13.07 
27/3/2017 1:45:00 13.07 
27/3/2017 1:50:00 13.02 
27/3/2017 1:55:00 13.13 
27/3/2017 2:00:00 12.99""" 
#after testing replace 'StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(StringIO(temp), 
       sep="\s+", #alternatively delim_whitespace=True 
       index_col=[0], 
       parse_dates={'Dates':['Date','Time']}) 

然後resample和聚集firstsummean ...:

df1 = df.resample('1H')['Point_1'].first().reset_index() 
print (df1) 
       Dates Point_1 
0 2017-03-27 00:00:00 13.08 
1 2017-03-27 01:00:00 13.19 
2 2017-03-27 02:00:00 12.99 
df1 = df.resample('1H')['Point_1'].sum().reset_index() 
print (df1) 
       Dates Point_1 
0 2017-03-27 00:00:00 158.58 
1 2017-03-27 01:00:00 156.98 
2 2017-03-27 02:00:00 12.99 

groupbyGrouper另一種解決方案:

df1 = df.groupby(pd.Grouper(freq='1H')).first().reset_index() 
print (df1) 
       Dates Point_1 
0 2017-03-27 00:00:00 13.08 
1 2017-03-27 01:00:00 13.19 
2 2017-03-27 02:00:00 12.99 

或許需要:

df = pd.read_csv(StringIO(temp),delim_whitespace=True, parse_dates={'Dates':['Date','Time']}) 

mask = df.Dates.dt.round('H').ne(df.Dates) 
df1 = df[mask] 
print (df1) 
       Dates Point_1 
1 2017-03-27 00:05:00 12.96 
2 2017-03-27 00:10:00 13.30 
3 2017-03-27 00:15:00 13.27 
4 2017-03-27 00:20:00 13.15 
5 2017-03-27 00:25:00 13.14 
6 2017-03-27 00:30:00 13.25 
7 2017-03-27 00:35:00 13.26 
8 2017-03-27 00:40:00 13.24 
9 2017-03-27 00:45:00 13.43 
10 2017-03-27 00:50:00 13.23 
11 2017-03-27 00:55:00 13.27 
13 2017-03-27 01:05:00 13.17 
14 2017-03-27 01:10:00 13.10 
15 2017-03-27 01:15:00 13.06 
16 2017-03-27 01:20:00 12.99 
17 2017-03-27 01:25:00 13.08 
18 2017-03-27 01:30:00 13.04 
19 2017-03-27 01:35:00 13.06 
20 2017-03-27 01:40:00 13.07 
21 2017-03-27 01:45:00 13.07 
22 2017-03-27 01:50:00 13.02 
23 2017-03-27 01:55:00 13.13 
0

謝謝大家!

這裏是我的完整代碼,用於讀取所有文件夾中的所有文件,並將過濾的數據(僅限小時)寫入新的csv文件。 我不會經常編寫代碼,所以我的編程技能不是很好。我相信有更好的方法來做同樣的事情,我不是隻談論熊貓圖書館,而是談論整個代碼。我希望我能用更好的東西取代我的if循環。這主要是爲了防止列表走出索引(類似k = k-1,但不知道放在哪裏)。 我的代碼運行正常。如果有更好的發燒友,請加入!

我的文件夾結構如下所示:Building1是包含20個子文件夾的主文件夾,每個子文件夾包含19-20個文件。

乾杯

import os 
import pandas as pd 
folderarray = [] 
filearray =[] 
patharray =[] 

path = "C:\Users\Priyanka\Documents\R_Python\OneHourInterval\Building1" 
os.chdir(path) 


for foldername in os.listdir(os.getcwd()): 
    folderarray.append(foldername) 
    print folderarray 

for i in range(0,len(folderarray)): 
    filename = os.listdir(path+"\\"+folderarray[i]) 
    filearray.append(filename) 

for j in range(0,len(folderarray)): 
    for k in range(0,len(filearray)): 
     if k < len(filearray[j]): 
      df1 = pd.read_csv(path+"""\\"""+folderarray[j]+"""\\"""+filearray[j][k], sep=",", header=None) 
      df = df1[2:len(df1)] 
      df = df[[0,1,2,3,4,5]] 
      df.columns = ['Date','Time','KWH','OCT','RAT','CO2'] 
      dftime = pd.to_datetime(df['Time'])  
      df['dt'] = pd.to_datetime(df['Date'] + ' ' + df['Time']) 
      df = df.set_index('dt').resample('1H')['KWH','OCT','RAT','CO2'].first().reset_index() 
      print df 
      print path+"""\\"""+folderarray[j]+"""\\"""+filearray[j][k] 
      str = filearray[j][k] 
      newfilename = str.replace(".dat",".csv") 
      df.to_csv(path+"""\\"""+folderarray[j]+"""\\"""+newfilename)