熊猫:带日期的逻辑运算

时间:2019-07-31 18:03:33

标签: python pandas date

我是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转换为实际日期。

1 个答案:

答案 0 :(得分:0)

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

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

获得。