Python 从今天日期获取熊猫数据框中最近的未来日期

Python 从今天日期获取熊猫数据框中最近的未来日期,python,datetime,Python,Datetime,我有一个DataFrame df_holiday,我想选择一行,它包含从todays date开始的下一个最近的日期,以便提取假日名称 +----------+---------------------+ | date | name | +----------+---------------------+ | 01012019 | Neujahr | | 06012019 | Heilige Drei Könige | | 19042

我有一个DataFrame df_holiday,我想选择一行,它包含从todays date开始的下一个最近的日期,以便提取假日名称

+----------+---------------------+
|   date   |        name         |
+----------+---------------------+
| 01012019 | Neujahr             |
| 06012019 | Heilige Drei Könige |
| 19042019 | Karfreitag          |
| 22042019 | Ostermontag         |
| 01052019 | Tag der Arbeit      |
| 10062019 | Pfingstmontag       |
+----------+---------------------+
如果我键入df_holiday['date'][0],它将输出str

现在,我想使用以下方法将列转换为datetime格式:

import datetime
df_holiday['date'] = df_holiday['date'].apply(lambda x: datetime.datetime.strptime(x, '%d%m%Y'))
这里的第一个问题:Doc说它将返回一个datetime,但在我的例子中,我得到了一个时间戳,为什么

type(df_holiday['date'][0])
pandas._libs.tslibs.timestamps.Timestamp

print(df_holiday['date'][0]
Timestamp('2019-01-01 00:00:00')
我从世卫组织那里找到了这篇文章,建议采取以下常规:

min([d for d in df_holiday['date'] if d> datetime.date.today()], key=lambda s: 
          datetime.datetime.strptime(s, "%d%m%Y").date()-datetime.date.today())
因为date列中的值是时间戳,所以我得到了一个

TypeError:无法将类型“Timestamp”与类型“date”进行比较

我认为,如果可以将日期列转换为适当的日期时间格式,而不是时间戳格式,这将起作用。 我怎样才能做到这一点?
或者有更好的解决方案吗?

您可以将时间戳转换为日期,如下所示:

import datetime
readable = datetime.datetime.fromtimestamp(1558272180)
print(readable)
2019-05-19T13:23:00
下面是一个示例,其中包括几种其他方法。

因为日期列是字符串,所以将其转换为日期对象

作为pd进口熊猫 df['date']=pd.to_datetimedf['date'],格式='%d%m%Y'

这会将日期列转换为日期类型


接下来,您可以尝试如上所述的最近日期算法,该算法不会转换为时间戳格式。您可以这样做:它将使用todays date按节假日日期进行筛选,然后选择下一个日期并返回其名称。我试着让它尽可能的像蟒蛇一样。有任何问题,请提问

import pandas as pd
import numpy as np
from pandas.compat import StringIO
from datetime import datetime
import dateutil.parser
RawData="""
date|name
01012019|Neujahr            
06012019|Heilige Drei Könige 
19042019|Karfreitag          
22042019|Ostermontag         
01052019|Tag der Arbeit      
10062019|Pfingstmontag  
14092019|Internationale Feiertage

"""
holidays = pd.read_csv(StringIO(RawData), sep="|",dtype={'date': object})
holidays['date'] = holidays['date'].astype(str).apply(lambda x: dateutil.parser.parse(x[4:8]+x[2:4]+x[0:2]))
holidays[holidays.date > datetime.now()].head(1)['name']  #compare with todays date and get the next one
结果:

5    Pfingstmontag  

谢谢,但这并不能解决问题。如果我打印数据列中的第一行,它将返回时间戳'2019-01-01 00:00:00',此外,您的建议返回可读的str而不是dateMy bad,您必须删除isoformat以获得datetime类型。我编辑了我的Anwser。它还返回一个时间戳:df_holiday['date']=pd。to_datetimedf_holiday['date'],format='%d%m%Y'-typedf_holiday['date'][0]-pandas.\u libs.tslibs.timestamps.timestamps非常感谢,这正是我需要的。但是你能简单地解释一下解析器的功能吗?我没有得到parsex[4:8]+x[2:4]+x[0:2]部分好的,日期有8个字符串,例如第一个:01012019,2019是年份;这就是第4-8个字符。x[4:8]年x[2:4]月x[0:2]天