我是python的新手(2周的经验)
无法提供具体信息。因为数据和代码在我的计算机上工作。
我在python / pandas中难以处理日期运算,并且想使用类似以下的逻辑运算:
如果date1> 2019-7-31,则在var1中写入1
反之亦然,写0
我还想比较列:
如果date2> date1,则在var2中写入1
反之亦然,写0
ID date1 date2
1 2019-10-1 2019-7-2
2 2019-7-30 2019-10-10
.
.
40000
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转换为实际日期。
答案 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
获得。