2016-04-21 146 views
0

我在csv文件中讀取日期時間列,其中包含非日期時間文本的隨機散佈塊(一次5個行,有時是一行中的多個塊)。參閱下面的剪斷的數據文件的一個例子:熊貓非索引過濾器的索引過濾器

日期,時間,次數,故障,電池 22分之12/ 2015,05:24.0,39615.0,0.0,6.42 22分之12/ 2015,05:25.0 ,39616.0,0.0,6.42 12/22/2015,05:26.0,39617.0,0.0,6.42 12/22/2015,05:27.0,39618.0,0.0,6.42 ,,,, Sonde STSO3275 ,,,, RMR ,,,, 默認站點,,,, X2CMBasicOpticsBurst ,,,, ,,,, 探空STSO3275 ,,,, RMR ,,,, 默認站點,,,, X2CMBasicOpticsBurst ,,,, 12/22/2015,19:57.0,39619。 0,0.0,6.42 12/22/2015,19:58.0,39620.0,0.0,6.42 12/22/2015,19:59.0,39621.0,0.0,6.42 12/22/2015,20:00.0,39622.0, 0.0,6.42 22分之12/ 2015,20:01.0,39623.0,0.0,6.42 22分之12/ 2015,20:02.0,39624.0,0.0,6.42

我可以讀取從剪貼板並進入數據據幀如下:

df = pd.read_clipboard(sep=',') 

我正在尋找一種方式來清理非日期格式的字符串的「日期」列轉換爲datetime指標之前。我曾嘗試列轉換爲索引,然後到列表和過濾這樣的:

df.index=df['Date'] 
df = df[~df.index.get_loc('RMR')] 
df = df[~df.index.get_loc('Default Site')] 
df = df[~df.index.get_loc('X2CMBasicOpticsBurst')] 
df = df[~df.index.get_loc('Sonde STSO3275')] 
df = df.dropna() 

然後我可以解析日期和時間在一起,並使用最新解析工具得到適當的日期時間指數。 但是,文本字段的內容可能會更改,並且此方法看起來非常有限且非pythonic。

因此,我正在尋找一種更好,更靈活和動態的方法來自動跳過索引中的這些非日期字段,希望無需知道其內容的詳細信息(例如,當空白時跳過4行塊行遇到)。

在此先感謝。

回答

0

好了,你可以使用to_datetime

df.loc[:, 'Date'] = pd.to_datetime(df.Date, errors='coerce') 

元素不是一個日期將被轉換NAT的 那麼你可以將其刪除。

df = df.dropna() 
0

我認爲你可以使用read_csvdropnato_datetime

import pandas as pd 
import io 

temp=u"""Date,Time,Count,Fault,Battery 
12/22/2015,05:24.0,39615.0,0.0,6.42 
12/22/2015,05:25.0,39616.0,0.0,6.42 
12/22/2015,05:26.0,39617.0,0.0,6.42 
12/22/2015,05:27.0,39618.0,0.0,6.42 
,,,, 
Sonde STSO3275,,,, 
RMR,,,, 
Default Site,,,, 
X2CMBasicOpticsBurst,,,, 
,,,, 
Sonde STSO3275,,,, 
RMR,,,, 
Default Site,,,, 
X2CMBasicOpticsBurst,,,, 
12/22/2015,19:57.0,39619.0,0.0,6.42 
12/22/2015,19:58.0,39620.0,0.0,6.42 
12/22/2015,19:59.0,39621.0,0.0,6.42 
12/22/2015,20:00.0,39622.0,0.0,6.42 
12/22/2015,20:01.0,39623.0,0.0,6.42 
12/22/2015,20:02.0,39624.0,0.0,6.42""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), parse_dates=[['Date','Time']]) 
df = df.dropna() 
df['Date_Time'] = pd.to_datetime(df.Date_Time, format="%m/%d/%Y %H:%M.%S") 
print df 
      Date_Time Count Fault Battery 
0 2015-12-22 05:24:00 39615.0 0.0  6.42 
1 2015-12-22 05:25:00 39616.0 0.0  6.42 
2 2015-12-22 05:26:00 39617.0 0.0  6.42 
3 2015-12-22 05:27:00 39618.0 0.0  6.42 
14 2015-12-22 19:57:00 39619.0 0.0  6.42 
15 2015-12-22 19:58:00 39620.0 0.0  6.42 
16 2015-12-22 19:59:00 39621.0 0.0  6.42 
17 2015-12-22 20:00:00 39622.0 0.0  6.42 
18 2015-12-22 20:01:00 39623.0 0.0  6.42 
19 2015-12-22 20:02:00 39624.0 0.0  6.42