eri*_*mjl 5 python datetime date pandas
在我的数据集中,我有一个date列,其中的数据是混合格式。
YYYY(例如2009)MMM-YY(例如Jan-08)MM/DD/YYYY(例如01/15/2006)如何删除不遵循格式的条目MM/DD/YYYY?我不太确定从哪里开始。
下面,我将.head()的数据提供为dict。
{'Collection Date': {0: '2001',
1: '2002',
2: '2006',
3: '2/19/2006',
4: '2/28/2006'},
'Complete Genome': {0: 'No', 1: 'No', 2: 'No', 3: 'No', 4: 'No'},
'Country': {0: 'Egypt', 1: 'Egypt', 2: 'Egypt', 3: 'Egypt', 4: 'Egypt'},
'Flu Season': {0: '-N/A-', 1: '-N/A-', 2: '-N/A-', 3: '-N/A-', 4: '-N/A-'},
'Host Species': {0: 'IRD:Human',
1: 'IRD:Human',
2: 'IRD:Bird/Avian',
3: 'IRD:Chicken/Avian',
4: 'IRD:Avian'},
'Protein Name': {0: 'NA', 1: 'NA', 2: 'NA', 3: 'NA', 4: 'HA'},
'Segment': {0: 6, 1: 6, 2: 6, 3: 6, 4: 4},
'Segment Length': {0: 1428, 1: 1449, 2: 1441, 3: 1363, 4: 1707},
'Sequence Accession': {0: 'AJ457944',
1: 'AJ457943',
2: 'GU050304',
3: 'GQ184251',
4: 'KF178948'},
'State/Province': {0: '-N/A-',
1: '-N/A-',
2: '-N/A-',
3: '-N/A-',
4: '-N/A-'},
'Strain Name': {0: '(A/Egypt/84/2001(H1N2))',
1: '(A/Egypt/96/2002(H1N2))',
2: 'A/avian/Egypt/920431/2006(H9N2)',
3: 'A/chicken/Egypt/06207-NLQP/2006(H5N1)',
4: 'A/chicken/Egypt/0626/2006'},
'Subtype': {0: 'H1N2', 1: 'H1N2', 2: 'H9N2', 3: 'H5N1', 4: 'H5N1'}}
Run Code Online (Sandbox Code Playgroud)
您可以使用pd.to_datetime选项errors='coerce'将无效日期转换为NaT然后过滤掉NaTsdropna()
例子:
>>> df = pd.DataFrame({'date':['01/03/1987', '2003', 'Jan-08', '31/01/2010', '2/13/2016'],'value':range(5)})
>>> df
date value
0 01/03/1987 0
1 2003 1
2 Jan-08 2
3 31/01/2010 3
4 2/13/2016 4
Run Code Online (Sandbox Code Playgroud)
格式:DD/MM/YYYY
>>> pd.to_datetime(df['date'], format='%d/%m/%Y', errors='coerce')
0 1987-03-01
1 NaT
2 NaT
3 2010-01-31
4 NaT
>>> df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y', errors='coerce')
>>> df.dropna()
date value
0 1987-03-01 0
3 2010-01-31 3
Run Code Online (Sandbox Code Playgroud)
如果您的日期仅是YYYY或MMM / YYYY或MM / DD / YYYY,而不是应用正则表达式仅匹配MM / DD / YYYY,那么您可以利用MM / DD / YYYY是长度为10的字符串的事实:
In [8]:
import pandas as pd
pd.set_option('display.notebook_repr_html', False)
df = pd.DataFrame({'date':['01/03/1987', '2003', 'Jan-08', '31/01/2010']})
df
Out[8]:
date
0 01/03/1987
1 2003
2 Jan-08
3 31/01/2010
[4 rows x 1 columns]
In [9]:
df.ix[df.date.str.len() !=10]
Out[9]:
date
1 2003
2 Jan-08
[2 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用to_datetime:
In [16]:
df1 = df.ix[df.date.str.len() !=10]
df1
Out[16]:
date
1 2003
2 Jan-08
[2 rows x 1 columns]
In [17]:
df1.date = pd.to_datetime(df1.date)
df1
Out[17]:
date
1 2003-01-01 00:00:00
2 2014-01-08 00:00:00
[2 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)
仅出于完整性考虑,如果您想使用regexp进行过滤:
df.ix[~df.date.str.contains('(\d{2})[/](\d{2})[/](\d{4})')]
Run Code Online (Sandbox Code Playgroud)
会起作用,请注意~这是一个否定
| 归档时间: |
|
| 查看次数: |
3011 次 |
| 最近记录: |