【问题标题】:Python does not convert datePython不转换日期
【发布时间】:2019-09-24 06:18:13
【问题描述】:

我有这个代码

X_train= df[df["Date"]<datetime.date.today() - datetime.timedelta(days=30)].drop(Target, axis=1)
y_train= df[df["Date"]<datetime.date.today() - datetime.timedelta(days=30)][Target]

但我收到了这个错误

TypeError: 'str' 和 'datetime.date' 的实例之间不支持'

我的日期字段如下所示“2019-08-07”、“2018-11-26”

因此,我使用

将类型从 str 更改为 date
df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%Y-%m-%d')

然后调用我的原始代码

X_train= df[df["Date"]<datetime.date.today() - datetime.timedelta(days=30)].drop(Target, axis=1)
y_train= df[df["Date"]<datetime.date.today() - datetime.timedelta(days=30)][Target]

但仍然出现同样的错误

TypeError: 'str' 和 'datetime.date' 的实例之间不支持'

如何解决?

【问题讨论】:

  • 索引是df["Date"]
  • 这是过滤条件
  • 我在问括号是否正确。
  • 是的,他们是正确的

标签: python pandas python-datetime


【解决方案1】:

您可以使用Series.dt.normalize 使用日期时间来使用Timestamp.normalize 删除时间:

df['Date'] = pd.to_datetime(df['Date']).dt.normalize()
today = pd.to_datetime('today').normalize()   

或者Series.dt.floorTimestamp.floor

df['Date'] = pd.to_datetime(df['Date']).dt.floor('d')
today = pd.to_datetime('today').floor('d') 

然后过滤:

X_train= df[df["Date"] < today - pd.Timedelta(days=30)].drop(Target, axis=1)
y_train= df.loc[df["Date"] < today - pd.Timedelta(days=30), 'Target']

【讨论】:

    【解决方案2】:

    你可以写成:

    df["Date"] = datetime.datetime.strptime(df["Date"], "%Y-%m-%d").date()
    
    X_train= df[(datetime.date.today() - df["Date"]) > datetime.timedelta(days=30)].drop(Target, axis=1)
    

    【讨论】:

    • 得到这个错误 TypeError: strptime() argument 1 must be str, not Series
    • df["Date"] 是一个系列吗?您需要输入单个值或从整列执行操作
    【解决方案3】:

    检查列日期的数据类型:df[Date].dtype。 如果是系列,请执行以下操作:

    X_train= df[(datetime.date.today() - df["Date"].dt.date) > datetime.timedelta(days=30)].drop(Target, axis=1)
    

    如果它的字符串像你提到的那样将它转换为日期时间,然后调用上面的代码。

    【讨论】:

      【解决方案4】:
      df["Date"] = pd.to_datetime(df['Date'], format='%Y-%m-%d')
      
      X_train= df[df["Date"]<datetime.date.today() - datetime.timedelta(days=60)].drop(Target, axis=1)
      y_train= df[df["Date"]<datetime.date.today() - datetime.timedelta(days=60)][Target]
      

      【讨论】:

      • 以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
      猜你喜欢
      • 2016-07-07
      • 2010-12-17
      • 2023-03-27
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      相关资源
      最近更新 更多