如何使 Pandas 中的所有非日期值都为空

And*_* Do 2 python pandas

我有一个 excel 文档,其中用户将日期和字符串放在同一列中。我想让每个字符串对象为空并保留所有日期。我如何在熊猫中做到这一点?谢谢。

小智 5

正如@Jeff所提到的,在 DataFrame 中转换日期的一种简单方法是使用pandas.DataFrame.convert_objects,它还可以处理数字和时间增量。下面是一个使用它的例子:

# contents of Sheet1 of test.xlsx
x  y             date1      z     date2      date3
1  fum        6/1/2016      7  9/1/2015    string3
2  fo         6/2/2016  alpha   string0  10/1/2016
3  fi         6/3/2016      9  9/3/2015  10/2/2016
4  fee        6/4/2016     10   string1    string4
5  dumbledum  6/5/2016   beta   string2  10/3/2015
6  dumbledee  6/6/2016     12  9/4/2015    string5

import pandas as pd
xl = pd.ExcelFile('test.xlsx')
df = xl.parse("Sheet1")
df1 = df.convert_objects(convert_dates='coerce')
# 'coerce' required for conversion to NaT on error
df1
Out[7]: 
   x          y      date1      z      date2      date3
0  1        fum 2016-06-01      7 2015-09-01        NaT
1  2         fo 2016-06-02  alpha        NaT 2016-10-01
2  3         fi 2016-06-03      9 2015-09-03 2016-10-02
3  4        fee 2016-06-04     10        NaT        NaT
4  5  dumbledum 2016-06-05   beta        NaT 2015-10-03
5  6  dumbledee 2016-06-06     12 2015-09-04        NaT
Run Code Online (Sandbox Code Playgroud)

在一个数据帧单独的列可以使用转换pandas.to_datetime,如由@Jeff指出的那样,并用pandas.Series.map,但是既没有在适当的位置进行。例如,使用 pandas.to_datetime:

import pandas as pd
xl2 = pd.ExcelFile('test.xlsx')
df2 = xl2.parse("Sheet1")
for col in ['date1', 'date2', 'date3']:
    df2[col] = pd.to_datetime(df2[col],coerce=True, infer_datetime_format=True)
df2
Out[8]: 
   x          y      date1      z      date2      date3
0  1        fum 2016-06-01      7 2015-09-01        NaT
1  2         fo 2016-06-02  alpha        NaT 2016-10-01
2  3         fi 2016-06-03      9 2015-09-03 2016-10-02
3  4        fee 2016-06-04     10        NaT        NaT
4  5  dumbledum 2016-06-05   beta        NaT 2015-10-03
5  6  dumbledee 2016-06-06     12 2015-09-04        NaT
Run Code Online (Sandbox Code Playgroud)

并使用 pandas.Series.map:

import pandas as pd
import datetime
xl3 = pd.ExcelFile('test.xlsx')
df3 = xl3.parse("Sheet1")
for col in ['date1', 'date2', 'date3']:
    df3[col] = df3[col].map(lambda x: x if isinstance(x,(datetime.datetime)) else None)
df3
Out[9]: 
   x          y      date1      z      date2      date3
0  1        fum 2016-06-01      7 2015-09-01        NaT
1  2         fo 2016-06-02  alpha        NaT 2016-10-01
2  3         fi 2016-06-03      9 2015-09-03 2016-10-02
3  4        fee 2016-06-04     10        NaT        NaT
4  5  dumbledum 2016-06-05   beta        NaT 2015-10-03
5  6  dumbledee 2016-06-06     12 2015-09-04        NaT
Run Code Online (Sandbox Code Playgroud)

在 excel 文档中转换日期的一种前期方法是解析其工作表。这可以使用pandas.ExcelFile.parse的转换器选项来完成,该选项具有派生自pandas.to_datetime的函数作为转换器字典中的函数,并使用 coerce=True 启用它以将错误强制为 NaT。例如:

def converter(x):
    return pd.to_datetime(x,coerce=True,infer_datetime_format=True)
    # the following also works for this example
    # return pd.to_datetime(x,format='%d/%m/%Y',coerce=True)

converters={'date1': converter,'date2': converter, 'date3': converter}
xl4 = pd.ExcelFile('test.xlsx')
df4 = xl4.parse("Sheet1",converters=converters)
df4
Out[10]: 
   x          y      date1      z      date2      date3
0  1        fum 2016-06-01      7 2015-09-01        NaT
1  2         fo 2016-06-02  alpha        NaT 2016-10-01
2  3         fi 2016-06-03      9 2015-09-03 2016-10-02
3  4        fee 2016-06-04     10        NaT        NaT
4  5  dumbledum 2016-06-05   beta        NaT 2015-10-03
5  6  dumbledee 2016-06-06     12 2015-09-04        NaT
Run Code Online (Sandbox Code Playgroud)