2016-11-28 68 views
1

我有一個半小時分辨率的使用DateTimeIndex的數據框。其中小時值是錯誤的,需要被移位1小時背面Python Pandas:將兩行DateTimeIndex移位半個小時

數據正在從創建者已經確認爲錯誤的excel工作表讀入的數據在兩個時間戳錯誤。基本上,第一和03:00 03:30時間戳應轉向02:00和02:30

DateTime,Results 
2014-11-05 01:00:00,135 
2014-11-05 01:30:00,125 
2014-11-05 03:00:00,158 
2014-11-05 03:30:00,565 
2014-11-05 03:00:00,684 
2014-11-05 03:30:00,474 

可以裝入上述使用df = pd.read_clipboard(index_col=0, parse_dates=True, sep=',')

我曾嘗試合併df['2014-11-05 03:00:00'].shift(perfiods=1,freq='-60Min')但沒有太多的喜悅和不知道如何最好與此進行。感覺這應該很簡單,但碰到了一堵磚牆。

+2

你能只用正確的價值觀替換錯誤的價值觀? –

+1

我甚至會在Excel工作表本身做到這一點,如果我是你... –

+0

我最終這樣做了,但從我所瞭解的很多數據中,我最終會得到類似的錯誤,出於某種原因,所以想要一個如果發生的話,可以通過這種方式進行修改和修改 – user2956554

回答

0

爲了討論的方便,假設你在不知道在哪裏發生這種情況或不能編輯源文件的情況下是。這裏有一個方法,你可以這樣做:

In[1]: df = pd.read_clipboard(index_col=0, parse_dates=True, sep=',') 

現在,我們將索引轉換爲pd.Series因爲index不支持的項目分配。

我們將使用duplicated()與參數keep='last':中出現不止一次將在60分鐘被轉移的東西第一OCCURENCES:

In [2]: 
s = pd.Series(df.index) 
s[s.duplicated(keep='last')] = s[s.duplicated(keep='last')] + pd.Timedelta('-60Min') 
df.index = s 
df 

Out[2]: 

        Results 
DateTime      
2014-11-05 01:00:00  135 
2014-11-05 01:30:00  125 
2014-11-05 02:00:00  158 
2014-11-05 02:30:00  565 
2014-11-05 03:00:00  684 
2014-11-05 03:30:00  474 

以上會工作得很好假設你沒有進入一個時間戳會重複兩次以上的情況。


另一種方法是完全覆蓋使用pd.date_range,如果你知道一個事實,即它是一個持續的30分鐘間隔指數:

df.index = pd.date_range(start=df.index.min(), periods=len(df), freq='30Min') 
+0

Aweseome,謝謝 – user2956554

+0

樂於幫忙,歡迎來到Stack Overflow。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受。 –

相關問題