我有一个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格式,我认为这会起作用。 我该如何实现? 还是我的情况有更好的解决方案?
答案 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
列转换为日期类型。
接下来,您可以尝试使用如上所述的最接近的日期算法,但这不会转换为时间戳格式