在Pandas数据帧中获取从今天开始的最近的未来日期

2024-10-03 19:21:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个DataFrame dfèu 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

现在我想使用以下方法将列转换为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')

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

因为date列中的值是时间戳,所以我得到了一个

TypeError: Cannot compare type 'Timestamp' with type 'date'

我认为,如果可以将date列转换为适当的datetime格式而不是timestamp格式,这将是可行的。 我怎样才能做到这一点? 还是有更好的解决办法?你知道吗


Tags: lambdaname名称dataframedftodaydatetimedate
3条回答

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

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

这里有一个link和其他几种方法。你知道吗

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

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

这将date列转换为日期类型。你知道吗

接下来,您可以尝试上面提到的最近日期算法,这不会转换为时间戳格式

给你:这将使用今天的日期过滤的假日日期,并采取下一个并返回其名称。我试着让它尽可能的像Python一样。有什么问题,请问。你知道吗

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  

相关问题 更多 >