从今天开始获取熊猫数据框中最近的将来日期

时间:2019-05-21 08:05:18

标签: python datetime

我有一个DataFrame df_holiday,我想选择该行,该行包含今天的日期中的下一个最近的日期,以便提取假日名称。

+----------+---------------------+
|   date   |        name         |
+----------+---------------------+
| 01012019 | Neujahr             |
| 06012019 | Heilige Drei Könige |
| 19042019 | Karfreitag          |
| 22042019 | Ostermontag         |
| 01052019 | Tag der Arbeit      |
| 10062019 | Pfingstmontag       |
+----------+---------------------+

如果我做type(df_holiday['date'][0]),它将输出str

现在,我想使用此列将其转换为日期时间格式:

import datetime
df_holiday['date'] = df_holiday['date'].apply(lambda x: datetime.datetime.strptime(x, '%d%m%Y'))

这里的第一个问题:Doc说它将返回一个日期时间,但就我而言,我得到一个时间戳,为什么?

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

print(df_holiday['date'][0]
Timestamp('2019-01-01 00:00:00')

我从dawg找到了这篇帖子,他建议使用以下例程:

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())

由于日期列中的值是时间戳,所以我得到了

  

TypeError:无法将类型“时间戳”与类型“日期”进行比较

如果可以将date列转换为正确的datetime格式而不是timestamp格式,我认为这会起作用。 我该如何实现? 还是我的情况有更好的解决方案?

3 个答案:

答案 0 :(得分:2)

您要去的地方:它将使用今天的日期按假日日期进行过滤,并选择下一个日期并返回其名称。我试图使它尽可能pythonic。有任何问题,请问。

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  

答案 1 :(得分:0)

您可以像这样将时间戳转换为日期:

import datetime
readable = datetime.datetime.fromtimestamp(1558272180)
print(readable)
2019-05-19T13:23:00

这是link,还有其他几种实现方法。

答案 2 :(得分:0)

由于您的date列是字符串,因此将其转换为日期对象

import pandas as pd df['date'] = pd.to_datetime(df['date'],format='%d%m%Y')

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

接下来,您可以尝试使用如上所述的最接近的日期算法,但这不会转换为时间戳格式