用新值替换/重新分配Pandas值

xdnvmnnf  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(157)

我想从我的当前值重新分配/替换新值

20000123
19850123
19880112
19951201
19850123
20190821
20000512
19850111
19670133
19850123

如您所见,数据中包含19670133(YYYYMMDD),这意味着该日期不存在,因为没有包含33天的月份。因此,我想将其重新分配到月末。我尝试将其分配到月末,并且成功了。但是,当我尝试用新值替换旧值时,出现了问题。我尝试做的是:

for x in df_tmp_customer['date']:
    try:
        df_tmp_customer['date'] = df_tmp_customer.apply(pd.to_datetime(x), axis=1)
    except Exception:
        df_tmp_customer['date'] = df_tmp_customer.apply(pd.to_datetime(x[0:6]+"01")+ pd.offsets.MonthEnd(n=0), axis=1)

这部分是一个使它月底:

pd.to_datetime(x[0:6]+"01")+ pd.offsets.MonthEnd(n=0)
7fhtutme

7fhtutme1#

在大型数据集上可能效率不高,但可以使用pendument.parse()来完成

import pendulum

def parse_dates(x: str) -> pendulum:
    i = 0
    while ValueError:
        try:
            return pendulum.parse(str(int(x) - i)).date()
        except ValueError:
            i += 1

df["date"] = df["date"].apply(lambda x: parse_dates(x))
print(df)

         date
0  2000-01-23
1  1985-01-23
2  1988-01-12
3  1995-12-01
4  1985-01-23
5  2019-08-21
6  2000-05-12
7  1985-01-11
8  1967-01-31
9  1985-01-23
1u4esq0p

1u4esq0p2#

对于矢量解决方案,可以用途:


# try to convert to YYYYMMDD

date1 = pd.to_datetime(df['date'], format='%Y%m%d', errors='coerce')

# get rows for which conversion failed

m = date1.isna()

# try to get end of month

date2 = pd.to_datetime(df.loc[m, 'date'].str[:6], format='%Y%m', errors='coerce').add(pd.offsets.MonthEnd())

# Combine both

df['date2'] = date1.fillna(date2)
  • 注意:假设df['date']是字符串数据类型。如果是整数数据类型,则使用df.loc[m, 'date'].floordiv(100)代替df.loc[m, 'date'].str[:6]。*

输出量:

date      date2
0  20000123 2000-01-23
1  19850123 1985-01-23
2  19880112 1988-01-12
3  19951201 1995-12-01
4  19850123 1985-01-23
5  20190821 2019-08-21
6  20000512 2000-05-12
7  19850111 1985-01-11
8  19670133 1967-01-31 # invalid replaced by end of month
9  19850123 1985-01-23

相关问题