2016-03-06 62 views
0

我試圖插入採用以分鐘爲數據導入谷歌BigQuery的大型數據集,而是查詢我重新採樣數據轉換成用大熊貓4個單獨的CSV文件時降低我的資源使用情況:分鐘,15分鐘,每小時和每天。對於前3個,所有重新採樣都很好。但是當我嘗試重新採樣到日期值時,resample函數會刪除小時信息(我只需要在00:00)。重採樣大熊貓據幀到一天取出小時部分

而且BigQuery的指定時間戳格式YYYY-MM-DD HH:MM:SS,但我只有YYYY-MM-DD的日期值。

下面的代碼:

for i, f in enumerate(fluksos): 
print "Flukso {} of {}".format(i+1, len(fluksos)) 
for j, s in enumerate(f.sensors): 
    print "Sensor {} of {}".format(j+1, len(f.sensors)) 
    for week in weekindex: 
     print "week {}, fetching data".format(week), 
     ts = dl.tmpo_series(s.sensor_id, head=week, tail= week + pd.Timedelta(days=7)) 
     if ts is None: 
      print "No data" 
      continue 
     print "success" 
     ts = pd.concat([ts], axis=1) 
     ts.columns = ['consumption'] 

     ts = ts.resample('d', how='mean') 
     ts['meterID'] = s.sensor_id 

     for group in ts.groupby(ts.index.day): 
      filename = "day.{}.{}.csv".format(s.sensor_id,group[1].first_valid_index().date()) 

      #save file locally 
      group[1].to_csv('temp.csv', header=False) 

      if os.path.isfile(os.path.join(path_to_data,filename)) and (filecmp.cmp('temp.csv', os.path.join(path_to_data, filename))): 
       print "file already exists, not saving", 
       continue 
      else: 
       print "saving new file", 
      group[1].to_csv(os.path.join(path_to_data, filename), header=False) 

      print ".", 
     print "week done" 

我知道我必須要改變的ts = ts.resample('d', how='mean')線的東西,但我似乎無法找出什麼。請記住,我在Python編程方面沒有太多的經驗。

編輯& FIX:

我能解決這個問題是這樣的:

ts = ts.tz_localize('UTC') 
ts = ts.tz_convert('Europe/Brussels') 
ts = ts.resample('d', how='mean') 

顯然我Dataframes包含時間戳沒有時區信息,從而時間戳的小時部分被放棄了。因此,通過重新採樣問題之前添加時區固定

回答

1

我是能夠解決這樣的問題:

ts = ts.tz_localize('UTC') 
ts = ts.tz_convert('Europe/Brussels') 
ts = ts.resample('d', how='mean') 

顯然我Dataframes包含時間戳不時區信息,因此時間戳的小時部分被丟棄。所以通過在重新採樣之前添加時區,問題得到修復

0

你確定你正在失去你的時間,或者它只是不顯示?

df = pd.DataFrame({'A': [1, 2, 3, 4, 5]}, index=pd.date_range('2016-1-1 23:00', freq='H', periods=5)) 

df2 = df.resample('d') 
>>> df2 
       A 
2016-01-01 1.0 
2016-01-02 3.5 

# Pandas 0.17.1 
>>> df2.index[0] 
Timestamp('2016-01-01 00:00:00', offset='D') 

如果你真的只是有天,你也可以這樣做:

df2.index = pd.to_datetime(df2.index + ' 00:00:00')