gpt4 book ai didi

python - 将 Pandas 数据框中的无效日期转换为最近的有效日期

转载 作者:行者123 更新时间:2023-12-03 08:17:48 26 4
gpt4 key购买 nike

我有以下名为 df 的数据框,

Date        Data
05/30/2023 3.733
05/30/2022 3.294
05/30/2021 2.391
02/30/2021 1.807
11/30/2020 1.766
08/31/2020 1.920
05/31/2020 1.830
02/29/2020 2.960
11/30/2019 2.860
08/31/2019 2.680
05/31/2019 2.490
02/28/2019 2.560
11/30/2018 2.560
08/31/2018 2.500
05/31/2018 2.400
02/28/2018 2.310
11/30/2017 2.310
08/31/2017 2.350
05/31/2017 2.510
02/28/2017 2.400
11/30/2016 2.270
08/31/2016 2.220
05/31/2016 2.160
02/29/2016 2.160
11/30/2015 2.055
我可以看到第 4 个条目的日期无效。 (一月只有 28 或 29 天)我之前尝试使用 pd.to_datetime 转换日期索引功能,但我一直收到错误消息。所以我尝试了这个。 df['tempdate'] = pd.to_datetime(df.index, errors='coerce')产生了这张 table ,

Date Data tempdate
05/30/2023 3.733 2023-05-30
05/30/2022 3.294 2022-05-30
05/30/2021 2.391 2021-05-30
02/30/2021 1.807 NaT
11/30/2020 1.766 2020-11-30
08/31/2020 1.920 2020-08-31
05/31/2020 1.830 2020-05-31
02/29/2020 2.960 2020-02-29
11/30/2019 2.860 2019-11-30
08/31/2019 2.680 2019-08-31
05/31/2019 2.490 2019-05-31
02/28/2019 2.560 2019-02-28
11/30/2018 2.560 2018-11-30
08/31/2018 2.500 2018-08-31
05/31/2018 2.400 2018-05-31
02/28/2018 2.310 2018-02-28
11/30/2017 2.310 2017-11-30
08/31/2017 2.350 2017-08-31
05/31/2017 2.510 2017-05-31
02/28/2017 2.400 2017-02-28
11/30/2016 2.270 2016-11-30
08/31/2016 2.220 2016-08-31
05/31/2016 2.160 2016-05-31
02/29/2016 2.160 2016-02-29
11/30/2015 2.055 2015-11-30
问题是我有很多这样的数据框,错误可能出现在随机月份,应该是 30 天,但它们显示为 31。
我想从任何给我 NaT 的日期中减去 3 天错误。但由于日期不被视为日期,我似乎无法从中减去 3 天。
是否有可用于以编程方式修复此错误的 pandas 命令?
我试过
df.index = np.where(df['tempdate'].isna(), pd.to_datetime(df.index), pd.to_datetime(df['tempdate']-np.timedelta64(3,'D')))
但我仍然收到一个错误,指出日期超出范围。
我还尝试将日期分成不同的 strings并将其转换为 int使用这个减去 3 天,
df.index = np.where(df['tempdate'].isna(), df.index, pd.to_datetime(int(df.index.astype(str).str.split('/')[0]),int(df.index.astype(str).str.split('/')[1])-3,int(df.index.astype(str).str.split('/')[2])))
但我得到这个错误,
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
处理此类错误的最佳方法是什么?如何将此无效日期转换为最近的有效日期?

最佳答案

您可以转换您可以转换的内容,然后使用正则表达式替换损坏的日期,然后更新您之前尝试的转换。

def subtract_3_days(match):
days = int(match.group(1))
return str(days - 3)

tempdate = pd.to_datetime(df["Date"], format="%m/%d/%Y", errors="coerce")
fixed_dates = df.loc[tempdate.isna(), "Date"].str.replace(r"(?<=/)(\d+)(?=/)", subtract_3_days)
tempdate.update(pd.to_datetime(fixed_dates, format="%m/%d/%Y"))

df["proper_dates"] = tempdate
print(df)
Date Data proper_dates
0 05/30/2023 3.733 2023-05-30
1 05/30/2022 3.294 2022-05-30
2 05/30/2021 2.391 2021-05-30
3 02/30/2021 1.807 2021-02-27
4 11/30/2020 1.766 2020-11-30
5 08/31/2020 1.920 2020-08-31
6 05/31/2020 1.830 2020-05-31
7 02/29/2020 2.960 2020-02-29
8 11/30/2019 2.860 2019-11-30
9 08/31/2019 2.680 2019-08-31
10 05/31/2019 2.490 2019-05-31
11 02/28/2019 2.560 2019-02-28
12 11/30/2018 2.560 2018-11-30
13 08/31/2018 2.500 2018-08-31
14 05/31/2018 2.400 2018-05-31
15 02/28/2018 2.310 2018-02-28
16 11/30/2017 2.310 2017-11-30
17 08/31/2017 2.350 2017-08-31
18 05/31/2017 2.510 2017-05-31
19 02/28/2017 2.400 2017-02-28
20 11/30/2016 2.270 2016-11-30
21 08/31/2016 2.220 2016-08-31
22 05/31/2016 2.160 2016-05-31
23 02/29/2016 2.160 2016-02-29
24 11/30/2015 2.055 2015-11-30
分解它:
  • tempdate = pd.to_datetime(df["Date"], format="%m/%d/%Y", errors="coerce")将我们能做的转换为日期时间。如果它导致不正确的日期时间,那么我们将以 NaT 值结束。将此数组存储到名为“tempdate”的变量中
  • fixed_dates = df.loc[tempdate.isna(), "Date"].str.replace(r"(?<=/)(\d+)(?=/)", subtract_3_days)
  • df.loc[tempdate.isna(), "Date"] -> 无论在哪里tempdate有一个 NaT 值,从我们的 df 中回到我们原来的“日期”列中找到相应的字符串
  • .str.replace(r"(?<=/)(\d+)(?=/)", subtract_3_days)从没有很好转换的字符串子集中,找到该数组中被正斜杠包围的所有数字。 (例如,匹配此模式:“/digits/”以获取数字)。然后,当我们找到匹配项时,通过 subtract_3_days 运行它函数将该匹配转换为整数,减去 3,并将新值作为字符串返回。这使得斜线(月份和年份)之前或之后的任何数字都保持不变。现在我们有一个字符串数组,它们的“day”值基本上减去了 3 天。

  • tempdate.update(pd.to_datetime(fixed_dates, format="%m/%d/%Y"))由于我们确定了日期,但它们仍然是字符串。我们需要转换它们,然后替换那些 NaT tempdate 中的值。
  • df["proper_dates"] = tempdate最后将我们的数组/系列添加回我们的原始数据框作为新列。
  • 关于python - 将 Pandas 数据框中的无效日期转换为最近的有效日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64032907/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com