DoB列的日期格式如下:
0 12-Jan-79
1 13-Jan-70
2 11-Mar-84
3 11-Mar-84
4 01-May-86
...
1080 15-Mar-81
1081 07-Jul-96
1082 11-Apr-90
1083 22-Oct-64
1084 12-Jul-95
我需要将其转换为标准日期格式YYYY / MM / DD。
我尝试了df['DateOfBirth'] = pd.to_datetime(df['DateOfBirth'])
。在大多数情况下,这都可以正常工作。
但是在某些情况下,例如22-Oct-64
,我可以观察到数据转换为将来的日期,例如2064-10-22
。
我想在整列上尝试使用DoB.str[:-2]+'19'+DoB.str[-2:]
之类的东西。
如何解决该问题?
答案 0 :(得分:0)
您应指定格式:
df['DateOfBirth'] = pd.to_datetime(df['DateOfBirth'], '%d/%m/%y')
答案 1 :(得分:0)
您可以执行此操作。以我的样本df为例:
In [922]: df
Out[922]:
DOB
0 22/Oct/64
In [925]: df['DOB'] = pd.to_datetime(df['DOB'])
In [927]: from datetime import timedelta, date
In [928]: future = df['DOB'] > date(year=2050,month=1,day=1)
In [930]: df.loc[future, 'DOB'] -= timedelta(days=365.25*100)
In [931]: df
Out[931]:
DOB
0 1964-10-22
这还将解决以后的日期问题。
从docs
2000年(Y2K)问题:Python依赖于平台的C库,该库通常没有2000年问题,因为所有日期和时间都在内部以秒表示。给定%y格式代码时,函数strptime()可以解析两位数的年份。解析了两位数的年份后,将根据POSIX和ISO C标准进行转换:将值69-99映射为1969-1999,将值0-68映射为2000-2068。
答案 2 :(得分:0)
可以通过剪切两个字符,添加19 ,然后粘贴最后两个字符来实现目标。
export HADOOP_CLASSPATH="/tmp/jdbcjars/db2jcc4.jar:/tmp/jdbcjars/db2jcc_license_cisuz.jar"
sqoop import --libjars /tmp/jdbcjars/db2jcc4.jar,/tmp/jdbcjars/db2jcc_license_cisuz.jar ...
代码:df['DateOfBirth']
Out[14]:
0 12-Jan-79
1 13-Jan-70
2 11-Mar-84
3 11-Mar-84
4 01-May-86
...
1080 15-Mar-81
1081 07-Jul-96
1082 11-Apr-90
1083 22-Oct-64
1084 12-Jul-95
Name: DateOfBirth, Length: 1085, dtype: object
输出:
df['DateOfBirth'] = df['DateOfBirth'].str[:-2]+'19'+df['DateOfBirth'].str[-2:]
只需使用Out[16]:
0 12-Jan-1979
1 13-Jan-1970
2 11-Mar-1984
3 11-Mar-1984
4 01-May-1986
...
1080 15-Mar-1981
1081 07-Jul-1996
1082 11-Apr-1990
1083 22-Oct-1964
1084 12-Jul-1995
Name: DateOfBirth, Length: 1085, dtype: object
将columnn转换为日期时间格式。