找出两列日期格式不同的天数之间的绝对差值

2024-04-18 09:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找出python中有日期的两列之间以天为单位的绝对差异。 这在excel中很简单,但我想要python。你知道吗

我有一个xlsx文件,我已将其读取到python数据帧(使用pd.read_excel),示例数据读取如下: 这些列具有ddmmyyyy/dmmyyyy纯文本格式的日期详细信息。你知道吗

A B
2012年11月10日
26071993 27122007
28062010 312201年
16012010 21022016
02082015 14092010

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

因此,输出将是天数的差值:

C
2432年
5267
1984年
2227年
1783年

我采用的方法是:

  1. 将A和B转换为8位,因为在A和B的某些值中只有7位-使用df['A'].apply(lambda x: '{0:0>8}'.format(x))
  2. 使用pd.to_datetime转换为日期时间字段
  3. 通过复制B值和所有notnull日期值(即用当前日期替换NULL/empty),创建另一个临时列,比如CC
  4. 然后找出A和CC(天数)之间的绝对差值

我被困在第三步,无法继续。有没有更简单的方法?你知道吗


Tags: 文件数据方法示例read单位差异xlsx
2条回答

第一种选择是个好主意。避免混淆哪一天或哪一个月。你知道吗

# 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(string)。如果你能确认这一步就好了,因为其他一切都是从这里开始的。你知道吗

# 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

然后使用日期时间:

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

然后是差异

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

编辑:解释错误

正如你所说的评论中的错误。这意味着您的列A不是数据类型object。它不是int32就是int64。运行此命令以确认(I changed sample data columnAdtype以演示错误):

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

将数据类型转换为object之后,一切都将正常工作。你知道吗


zfill(8)将0填充到字符串中,并使用pd.to_datetimecoerce以及NaT上的filna和今天的日期将它们转换为datetime。接下来,做减法AB,做abs,从timedelta得到days

注意:添加预处理以使用astype(str)df数据类型转换为object

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

相关问题 更多 >