我试图找到列“c2”日期时间值与另一列“c1”日期时间值匹配的行,并从匹配行“rtn”返回一个值作为“新”值。它适用于以下示例
在实际问题中,第二个日期列包含该日期和该日期的较早预测值。在 date-1d、date-2d 等处做出了许多这样的预测。我最终想要生成的是一个将最终值与所有未来预测值进行比较的图表。
from datetime import datetime#, timedelta #, date #
import pandas as pd
import numpy as np
df = pd.DataFrame({'date1': [10, 11, 12], 'date2': [12, 11, 10], 'rtn':[21,22,23],'new':[99,99,99]})
print(df['date1'].isin(df['date2']) )
print(f'date1 \n{df.date1 == df.date2}')
datatypes = df.dtypes
print(df.dtypes)
print(df)
for index, row in df.iterrows():
row['new']=df.loc[df['date2'] ==row['date1'],'rtn'].iloc[0]
datatypes = df.dtypes
print(df.dtypes)
print(df)
但是,当我使用日期时间日期而不是整数时,它不会(我已经注释掉了将日期时间转换为字符串、浮点数甚至整数的尝试,如上所述,但它失败了)
from datetime import datetime#, timedelta #, date #
import pandas as pd
import numpy as np
date_time_ref = datetime(year=2020, month=1, day=1, hour=00, minute=00, second=00)
date_time_date11 = datetime(year=2024, month=10, day=20, hour=1, minute=00, second=00)
date_time_date12 = datetime(year=2024, month=10, day=21, hour=13, minute=00, second=00)
date_time_date13 = datetime(year=2024, month=10, day=22, hour=1, minute=00, second=00)
date_time_date23 = date_time_date11 #this is to ensure the test dates are identical
date_time_date22 = date_time_date12 #this is to ensure the test dates are identical
date_time_date21 = date_time_date13 #this is to ensure the test dates are identical
print(f'Test {date_time_date11 == date_time_date21}')
print(f'Test {date_time_date11 == date_time_date23}')
df = pd.DataFrame({'date1': [date_time_date11, date_time_date12, date_time_date13], 'date2': [date_time_date21, date_time_date22, date_time_date23], 'rtn':[21,22,23],'new':[99,99,99]})
datatypes = df.dtypes
print(df.dtypes)
print(df)
for index, row in df.iterrows():
row['new']=df.loc[df['date2'] ==row['date1'],'rtn'].iloc[0]
datatypes = df.dtypes
print(df.dtypes)
print(df)
print(df['date1'].isin(df['date2']) )
print(f'date1 \n{df.date1 == df.date2}')
我已经尝试了以下到上面日期时间的转换,没有对结果进行任何更改
df = df.reset_index() # make sure indexes pair with number of rows
# 1. convert to strings for comparison
df['date1'] = df['date1'].dt.strftime('%Y-%m-%d %H') #':%M:%S')
df['date2'] = df['date2'].dt.strftime('%Y-%m-%d %H') #:%M:%S')
# 2. convert the datetime column to an ordinal
df['date1'].apply(lambda x:x.toordinal())
df['date2'].apply(lambda x:x.toordinal())
# 3. convert the datetime column to an integer divide the resulting integer by the number of nanoseconds in a second
df['date1'] = df['date1'].astype(int)/ 10**9
df['date2'] = df['date2'].astype(int)/ 10**9
# 4. convert datetime to seconds
pd.to_timedelta(df.date1).dt.total_seconds()
pd.to_timedelta(df.date2).dt.total_seconds()
# 5. convert datetime to float64
df['date1'] = df['date1'] - date_time_ref
df['date2'] = df['date2'] - date_time_ref
df['date1'] = df['date1'] / np.timedelta64(1, 'h')
df['date2'] = df['date2'] / np.timedelta64(1, 'h')
# 6. convert to float64 above to int64
df['date1'] = df['date1'].astype(np.int64)
df['date2'] = df['date2'].astype(np.int64)
当初始代码运行时,“new”的值应该是 23, 22 21。但是,当输入 date1 和 date2 值从“int”类型更改为“datetime”类型时,代码不再提供正确的输出。 为什么相同的代码适用于一种输入类型(int)而不适用于另一种输入类型(datetime),这让我很困惑。
您可以通过映射数据框的子集来分配
new
列。
在下面,我们将
date1
列映射到 pandas.Series,其中 date2
作为索引,每个 rtn
值的第一个 date2
作为值。
df["new"] = df["date1"].map(
df
.drop_duplicates("date2")
.set_index("date2")
["rtn"]
).fillna(99) # if you want a value of `99` where there is no match
这对我来说对整数和时间戳都有效。