pandas 根据panda Dataframe 中的条件交换2个日期时间列

cgyqldqp  于 2022-12-25  发布在  其他
关注(0)|答案(2)|浏览(124)

我有两个日期时间列'date_a'和'date_B',我需要根据下面的条件交换它们,但是我得到了错误。交换日期时间列的正确方法是什么?

date_a      date_b
1   2020-09-01  2020-05-01
2   1992-01-01  1988-01-01
3   2013-10-01  2013-01-01

cond = df.date_a > df.date_b
df.loc[cond, ['date_a', 'date_b']] = df.loc[cond, ['date_b', 'date_a']].values

TypeError: cannot astype a datetimelike from [datetime64[ns]] to [float64]
bbmckpt7

bbmckpt71#

  • 在您的代码df.loc[cond, ['date_a ', 'date_b']]中似乎有一个拼写错误您真的打算创建一个新列**“date_a“**吗?
  • 我有模拟数据,它会根据情况交换日期
import pandas as pd
import numpy as np
df =pd.DataFrame({c:np.random.choice(pd.date_range("1-jan-2021",periods=40),10) for c in ['date_a', 'date_b'] })

cond = df.date_a > df.date_b
df.loc[cond, ['date_a', 'date_b']] = df.loc[cond, ['date_b', 'date_a']].values

使用提供的数据

  • 类型错误,panda 1.3.0
import pandas as pd
import numpy as np
import io
df =pd.DataFrame({c:np.random.choice(pd.date_range("1-jan-2021",periods=40),10) for c in ['date_a', 'date_b'] })
df = pd.read_csv(io.StringIO("""    date_a      date_b
1   2020-09-01  2020-05-01
2   1992-01-01  1988-01-01
3   2013-10-01  2013-01-01"""), sep="\s+")
df = df.assign(**{c:pd.to_datetime(df[c]) for c in df.columns})

cond = df.date_a > df.date_b
df.loc[cond, ['date_a', 'date_b']] = df.loc[cond, ['date_b', 'date_a']].values
rekjcdws

rekjcdws2#

我以前遇到过这个问题,解决方法如下:

df[["date_a_", "date_b_"]] = df[["date_a", "date_b"]].rank(axis=1, method="first")
df[["date_a", "date_b"]] = np.where(df["date_a_"] == 2, [df["date_b"], df["date_a"]], [df["date_a"], df["date_b"]])

相关问题