我需要找到在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
我遵循的方法是:
b8 9a...
pd.read_excel
我陷入了第三步,无法继续。有没有更简单的方法可以做到这一点?
答案 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
。它是int32
或int64
。运行以下命令以确认(我已更改示例数据列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
将它们转换为日期时间。接下来,进行减法A
和B
,使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