Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从数据帧的多个列中获取最接近今天的日期?_Python_Dataframe_Datetime - Fatal编程技术网

Python 如何从数据帧的多个列中获取最接近今天的日期?

Python 如何从数据帧的多个列中获取最接近今天的日期?,python,dataframe,datetime,Python,Dataframe,Datetime,我需要两个col第一个显示最近的日期,第二个显示col d = {'col1': ["id1","id2"] 'Stage 1': [26-01-2021, 04-01-2021],'Stage 2': [27-01-2021, 02-10-2025]} df = pd.DataFrame(data=d) df 图像参考 实际的 要求 我试过了 date=datetime.date.today() idx = plc.index[df[['Stage

我需要两个
col
第一个显示最近的日期,第二个显示
col

d = {'col1': ["id1","id2"] 'Stage 1': [26-01-2021, 04-01-2021],'Stage 2': [27-01-2021, 02-10-2025]}
df = pd.DataFrame(data=d)
df
图像参考

实际的

要求

我试过了

date=datetime.date.today()
idx = plc.index[df[['Stage 1','Stage 2']].index.get_loc(date, 
    method='nearest')]

以下内容将帮助您实现目标:

首先将日期转换为
日期时间
,以便在比较操作中使用它们:

df['Stage 1'] = pd.to_datetime(df['Stage 1'])
df['Stage 2'] = pd.to_datetime(df['Stage 2'])
然后查找最近日期的位置,例如使用:

closest = np.argmin([abs(df['Stage 1'].dt.date - date), 
                     abs(df['Stage 2'].dt.date - date)], axis=1)
并使用这些位置获取列的名称。您可以在第一个新列
Requirement 1

df['Requirement 1'] = df.columns[-2:][closest]
然后,您可以使用
要求1
中的列名来获取最接近的原始日期:

df['Requirement 2'] = df.apply(lambda x: x[x['Requirement 1']].date(), axis=1)
我的输出如下所示:

  col1    Stage 1    Stage 2 Requirement 1 Requirement 2
0  id1 2021-01-26 2025-01-27       Stage 1    2021-01-26
1  id2 2025-04-01 2019-02-10       Stage 2    2019-02-10

以下内容将帮助您实现目标:

首先将日期转换为
日期时间
,以便在比较操作中使用它们:

df['Stage 1'] = pd.to_datetime(df['Stage 1'])
df['Stage 2'] = pd.to_datetime(df['Stage 2'])
然后查找最近日期的位置,例如使用:

closest = np.argmin([abs(df['Stage 1'].dt.date - date), 
                     abs(df['Stage 2'].dt.date - date)], axis=1)
并使用这些位置获取列的名称。您可以在第一个新列
Requirement 1

df['Requirement 1'] = df.columns[-2:][closest]
然后,您可以使用
要求1
中的列名来获取最接近的原始日期:

df['Requirement 2'] = df.apply(lambda x: x[x['Requirement 1']].date(), axis=1)
我的输出如下所示:

  col1    Stage 1    Stage 2 Requirement 1 Requirement 2
0  id1 2021-01-26 2025-01-27       Stage 1    2021-01-26
1  id2 2025-04-01 2019-02-10       Stage 2    2019-02-10

将日期转换为datetime后,可以将其传递给一个函数,该函数可以一次性填充两个新列:

import pandas 
import datetime
d = {'col1': ["id1","id2"], 'Stage 1': ['26-01-2021', '04-01-2021'],'Stage 2': ['27-01-2021', '02-10-2025']}
df = pd.DataFrame(data=d)

df['Stage 1'] = pd.to_datetime(df['Stage 1'], format='%d-%m-%Y')
df['Stage 2'] = pd.to_datetime(df['Stage 2'], format='%d-%m-%Y')
date=pd.to_datetime(datetime.date.today())

def get_date(row):
    date_range = row[['Stage 1', 'Stage 2']]
    closest_date_key = abs(date - date_range).argmin()
    closest_date = date_range[closest_date_key]
    column_name = date_range.keys()[closest_date_key]
    return pd.Series((closest_date, column_name))

df[['Requirement 1', 'Requirement 2']] = df.apply(lambda row:get_date(row), axis=1)
输出:

|    | col1   | Stage 1             | Stage 2             | Requirement 1       | Requirement 2   |
|---:|:-------|:--------------------|:--------------------|:--------------------|:----------------|
|  0 | id1    | 2021-01-26 00:00:00 | 2021-01-27 00:00:00 | 2021-01-27 00:00:00 | Stage 2         |
|  1 | id2    | 2021-01-04 00:00:00 | 2025-10-02 00:00:00 | 2021-01-04 00:00:00 | Stage 1         |

将日期转换为datetime后,可以将其传递给一个函数,该函数可以一次性填充两个新列:

import pandas 
import datetime
d = {'col1': ["id1","id2"], 'Stage 1': ['26-01-2021', '04-01-2021'],'Stage 2': ['27-01-2021', '02-10-2025']}
df = pd.DataFrame(data=d)

df['Stage 1'] = pd.to_datetime(df['Stage 1'], format='%d-%m-%Y')
df['Stage 2'] = pd.to_datetime(df['Stage 2'], format='%d-%m-%Y')
date=pd.to_datetime(datetime.date.today())

def get_date(row):
    date_range = row[['Stage 1', 'Stage 2']]
    closest_date_key = abs(date - date_range).argmin()
    closest_date = date_range[closest_date_key]
    column_name = date_range.keys()[closest_date_key]
    return pd.Series((closest_date, column_name))

df[['Requirement 1', 'Requirement 2']] = df.apply(lambda row:get_date(row), axis=1)
输出:

|    | col1   | Stage 1             | Stage 2             | Requirement 1       | Requirement 2   |
|---:|:-------|:--------------------|:--------------------|:--------------------|:----------------|
|  0 | id1    | 2021-01-26 00:00:00 | 2021-01-27 00:00:00 | 2021-01-27 00:00:00 | Stage 2         |
|  1 | id2    | 2021-01-04 00:00:00 | 2025-10-02 00:00:00 | 2021-01-04 00:00:00 | Stage 1         |

谢谢很快。仅“今天”应替换为“日期”。这真的很有帮助。你说得对-我更新了答案。请随意选择您问题的答案,并请选择您认为最有用的答案。谢谢。很快。仅“今天”应替换为“日期”。这真的很有帮助。你说得对-我更新了答案。请随意选择你问题的答案,并请选择你认为最有用的答案。