查找2列之间的绝对差异,其中不同日期的格式为天数

时间:2019-05-30 15:11:29

标签: python pandas python-datetime

我需要找到在python中有日期的2列之间的天数的绝对差异。 在excel中这很容易,但是我想要在python中。

我有一个xlsx文件,已读取到python数据帧(使用ptrExternal),并读取了以下示例数据: 列中以ddmmyyyy / dmmyyyy的纯文本格式显示日期详细信息。

A A B
1102012
26071993 27122007
28062010 3122015
16012010 21022016
02082015 14092010

现在,我需要创建一个新列C,其中包含A和B之间的绝对天数差。A可以小于或大于B。
如果B为空,则应考虑当前日期以进行天数计算。但是A不会有空/ NULL值。

所以输出将是天数之差:

C
2432
5267
1984
2227
1783

我遵循的方法是:

  1. 将A和B转换为8位数字,因为在A和B的某些值中只有7位数字-使用b8 9a...
  2. 使用pd.read_excel
  3. 将A转换为日期时间字段
  4. 通过复制B值并使用所有非NULL日期值(用当前日期替换NULL /空)来创建另一个临时列,例如CC。
  5. 然后找到A和CC之间的绝对差(天数)

我陷入了第三步,无法继续。有没有更简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

第一个fomratting选项是个好主意。避免混淆是哪一天还是一天。

# Recreate dataframe
df = pd.DataFrame([["1102012", pd.np.NaN],["26071993","27122007"],
                   ["28062010","3122015"],["16012010","21022016"],
                   ["02082015","14092010"]], columns=["A","B"]) 

df['A'] = df['A'].apply(lambda x: '{0:0>8}'.format(x))
# 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") 
df['B'] = df['B'].apply(lambda x: '{0:0>8}'.format(x))

然后使用to_datetime:

df["A"] = pd.to_datetime(df["A"], format="%d%m%Y")
df["B"] = pd.to_datetime(df["B"], format="%d%m%Y")

然后比较

df["Diff"] = (df["A"] - df["B"]).abs()
# or
df["Diff"] = (df["A"] - df["B"]).abs().dt.days

答案 1 :(得分:0)

编辑错误解释

您说的是评论错误。这意味着您的列A不是dtype object。它是int32int64。运行以下命令以确认(我已更改示例数据列A dtype来显示错误):

df.dtypes

Out[2866]:
A     int32
B    object
dtype: object

在使用str.zfill之前,您需要将df更改为object,如下所示:

df = df.astype(str)

Out[2870]:
A    object
B    object
dtype: object

将dtype转换为object之后,一切都会正常。


zfill(8)将0填充为字符串,并使用pd.to_datetime中的coerce和今天的filna中的NaT将它们转换为日期时间。接下来,进行减法AB,使abs并从days获得timedelta

注意:添加了使用df

object dtype转换为astype(str)的预处理
df = df.astype(str) 
df1 = df.apply(lambda x: pd.to_datetime(x.str.zfill(8), format='%d%m%Y', errors='coerce')).fillna(pd.datetime.today().date())
df1.A.sub(df1.B).abs().dt.days

Out[2599]:
0    2432
1    5267
2    1984
3    2227
4    1783
dtype: int64