熊猫非索引过滤器的索引过滤器

问题描述:

我在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行块行遇到)。

在此先感谢。

好了,你可以使用to_datetime

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

元素不是一个日期将被转换NAT的 那么你可以将其删除。

df = df.dropna() 

我认为你可以使用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