【问题标题】:Get the nearest future date in a pandas dataframe from todays date从今天的日期获取熊猫数据框中最近的未来日期
【发布时间】:2019-05-21 08:05:17
【问题描述】:

我有一个 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:无法将“时间戳”类型与“日期”类型进行比较

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

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    给你:这将使用今天的日期来过滤假期日期,并取下一个日期并返回其名称。我试图让它尽可能地像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  
    

    【讨论】:

    • 非常感谢,这正是我所需要的。但是你能简单解释一下解析器功能吗?我没有得到 parse(x[4:8]+x[2:4]+x[0:2]) 部分
    • 好的,日期有 8 个字符串,例如第一个:01012019,2019 是年份;所以这是字符 4 - 8(四个字符)。
    • x[4:8]#year x[2:4]#month x[0:2]#day
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这也返回一个时间戳:df_holiday['date'] = pd.to_datetime(df_holiday['date'], format='%d%m%Y') --- type(df_holiday[ '日期'][0]) --- pandas._libs.tslibs.timestamps.Timestamp
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,但这并不能解决问题。如果我在我的数据列中打印第一行,它将返回时间戳('2019-01-01 00:00:00'),此外,您的建议返回可读为 str 而不是日期
    • 很遗憾,您删除了 isoformat() 以获取日期时间类型。我编辑了我的 anwser
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2014-06-04
    相关资源
    最近更新 更多