Первые варианты - хорошая идея.Избегает путаницы в отношении того, какой день или месяц.
# Recreate dataframe
df = pd.DataFrame([["1102012", pd.np.NaN],["26071993","27122007"],
["28062010","3122015"],["16012010","21022016"],
["02082015","14092010"]], columns=["A","B"])
print(df)
>>>
A B
0 1102012 NaN
1 26071993 27122007
2 28062010 3122015
3 16012010 21022016
4 02082015 14092010
print(df.dtypes)
>>>
A object
B object
dtype: object
Таким образом, фрейм данных, с которым мы работаем, находится выше.Все типы данных object
(строка).Было бы хорошо, если бы вы могли подтвердить этот шаг, поскольку все остальное происходит отсюда.
# convert some datetimes
# Assumption is that column A is not sparse - there are no NaNs
# Column B can be NaN so make it today if so
m = df["B"].isnull()
df.loc[m, "B"] = pd.datetime.now().strftime("%d%m%Y")
print(df)
>>>
A B
0 1102012 03062019
1 26071993 27122007
2 28062010 3122015
3 16012010 21022016
4 02082015 14092010
# now we zero pad some numbers
df['A'] = df['A'].apply(lambda x: '{0:0>8}'.format(x))
df['B'] = df['B'].apply(lambda x: '{0:0>8}'.format(x))
print(df)
>>>
A B
0 01102012 03062019
1 26071993 27122007
2 28062010 03122015
3 16012010 21022016
4 02082015 14092010
Затем используйте to_datetime:
df["A"] = pd.to_datetime(df["A"], format="%d%m%Y")
df["B"] = pd.to_datetime(df["B"], format="%d%m%Y")
print(df)
>>>
A B
0 2012-10-01 2019-06-03
1 1993-07-26 2007-12-27
2 2010-06-28 2015-12-03
3 2010-01-16 2016-02-21
4 2015-08-02 2010-09-14
print(df.dtypes)
>>>
A datetime64[ns]
B datetime64[ns]
dtype: object
Затем diff
df["Diff"] = (df["A"] - df["B"]).abs()
print(df)
>>>
A B Diff
0 2012-10-01 2019-06-03 2436 days
1 1993-07-26 2007-12-27 5267 days
2 2010-06-28 2015-12-03 1984 days
3 2010-01-16 2016-02-21 2227 days
4 2015-08-02 2010-09-14 1783 days
# or
df["Diff"] = (df["A"] - df["B"]).abs().dt.days
print(df)
>>>
A B Diff
0 2012-10-01 2019-06-03 2436
1 1993-07-26 2007-12-27 5267
2 2010-06-28 2015-12-03 1984
3 2010-01-16 2016-02-21 2227
4 2015-08-02 2010-09-14 1783