【问题标题】:Pandas: Logical Operations with datePandas:带日期的逻辑运算
【发布时间】:2019-07-31 18:03:33
【问题描述】:

我是 python 新手(2 周经验)

无法给出具体信息。因为工作时数据和代码都在我的电脑上。

我在 python/pandas 中处理日期操作并想使用以下逻辑操作:
如果 date1 > 2019-7-31 然后在 var1 中写入 1
反之写 0

我还想比较列:
如果 date2 > date1 然后在 var2 中写入 1
反之写 0

表1

ID    date1      date2        
1     2019-10-1  2019-7-2
2     2019-7-30  2019-10-10
.
.
40000

表 2

ID     date1       date2        var1   var2
1      2019-10-1   2019-7-2      1       0
2      2019-7-30   2019-10-10    0       1
.
.
40000

用 date.time 做实验 许多其他建议仅适用于变量,但不适用于列。

df.loc[df["date2"] > "date1", "date2"] = 1

-> 失败,因为 date1 被读取为字符串

df.loc[df["date1"] > 2019-7-3, "date2"] = 1
df.loc[df["date1"] > date.time[2019-7-3], "date2"] = 1

-> 无法找出正确的语法,因此2019-7-31 被读取为日期并且可比较。

在 python/pandas 中是否有办法将日期转换为 1900 日期系统? 所以2019-7-31 = 43677 = Year1900+Days43677.
这将解决日期处理的所有问题。因为您可以轻松比较数字。 当然,我想将 43677 重新转换为实际日期。

【问题讨论】:

  • pd.to_datetime?
  • 您几乎可以使用 pandas 日期时间功能 here is the documentation 来完成您想做的任何事情。你可以convert to datetimespd.to_datetime()
  • 就像我说的,我已经使用过 date.time,但在文档中找不到任何相关的案例。我看到了许多转换日期的方法,但没有看到如何实际使用它们进行计算。特别是如果您想比较列
  • @MartinFlower 查看我提供的将字符串转换为日期时间、比较列并有条件地创建列的解决方案。

标签: python pandas date


【解决方案1】:

将日期字符串转换为日期时间并进行比较:

import pandas as pd
import numpy as np

df = pd.DataFrame([['2019-07-05', '2019-08-01'],
                   ['2019-08-18', '2019-09-03'], ['2019-10-02', '2019-05-03']])

df.loc[pd.to_datetime(df[0]) > pd.to_datetime('2019-07-31'), "var1"] = 1
df.loc[pd.to_datetime(df[0]) <= pd.to_datetime('2019-07-31'), "var1"] = 0

df.loc[pd.to_datetime(df[1]) > pd.to_datetime(df[0]), "var2"] = 1
df.loc[pd.to_datetime(df[1]) <= pd.to_datetime(df[0]), "var2"] = 0


print(df)
#    0           1            var1  var2
# 0  2019-07-05  2019-08-01   0.0   1.0
# 1  2019-08-18  2019-09-03   1.0   1.0
# 2  2019-10-02  2019-05-03   1.0   0.0

使用 np.where() 更简单

df['var1'] = np.where(pd.to_datetime(
    df[0]) > pd.to_datetime('2019-07-31'), 1, 0)
df['var2'] = np.where(pd.to_datetime(df[1]) > pd.to_datetime(df[0]), 1, 0)

print(df)

#    0           1              var1  var2
# 0  2019-07-05  2019-08-01     0     1
# 1  2019-08-18  2019-09-03     1     1
# 2  2019-10-02  2019-05-03     1     0

运行示例也可通过github获得

【讨论】:

  • 非常感谢。这正是我正在寻找的。谢谢你广黄。现在我知道你在哪里试图告诉我。
    一个悬而未决的问题仍然存在:
    如何在计算中添加 2019-7-31
    我总是可以创建一个与 pd.to.datetime() 结合的新 var
    但是有没有更好的解决方案在表达式中写入日期(不是变量)?喜欢
    date1 &gt; the-date-in-numbers
    现在我会这样做:
    pd.to_datime(mydate) date1 &gt; mydate
  • df['var1']=np.where(pd.to_datetime(df[0])&gt;pd.to_datetime('2019-07-31'), 1, 0)df['var2']=np.where(pd.to_datetime(df[1]) &gt; pd.to_datetime(df[0]), 1, 0)。我会相应地修改解决方案。
  • @MartinFlower 根据您的需要更新了解决方案,看看吧。
  • @MartinFlower 这是否解决了您的问题或者您发现了一些问题?
  • @MartinFlower 很高兴知道您的问题已解决。你能接受答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2014-02-20
相关资源
最近更新 更多