【问题标题】:Extract time from datetime for comparison in pandas从日期时间中提取时间以在熊猫中进行比较
【发布时间】:2018-08-26 19:16:19
【问题描述】:

我有一个数据框

customer_number   purchase_time         quantity
14                2007-03-01 07:06:00   10
20                2007-03-12 13:05:00   13

我试图找出上午和下午购买的总数量。我将purchase_time 转换为日期时间

df['purchase_time'] = pd.to_datetime(df['purchase_time'])
# Baskets bought in morning.
df[df['purchase_time'] < '12:00:00']

但是,结果是原始数据集。

【问题讨论】:

    标签: python pandas datetime dataframe


    【解决方案1】:

    在groupby中使用布尔数组

    df.groupby(df.purchase_time.dt.hour < 12).sum().rename(
        {True: 'Morning', False: 'Afternoon'})
    
                   customer_number  quantity
    purchase_time                           
    Afternoon                   20        13
    Morning                     14        10
    

    【讨论】:

    • 我喜欢这个,但我要么将 customer_number 包含在 groupby 中,要么根本不包含,对吧?
    【解决方案2】:

    假设purchase_timedatetime dtype:

    In [88]: df.query("purchase_time.dt.hour < 12 and purchase_time.dt.month in [3,6]")
    Out[88]:
       customer_number       purchase_time  quantity
    0               14 2007-03-01 07:06:00        10
    

    【讨论】:

    • 我不知道您可以在查询/评估字符串中使用访问器。
    • @piRSquared,坦率地说,我不确定它是否是一个新功能......但如果这样的东西不起作用,我们可以尝试使用engine='python' - 这将适用大多数情况...
    【解决方案3】:

    你可以

    df[df['purchase_time'].dt.time < pd.to_datetime('12:00:00').time()]
    Out[152]: 
       customer_number       purchase_time  quantity
    0               14 2007-03-01 07:06:00        10
    

    【讨论】:

    • 我在尝试组合条件 df[df['purchase_time'].dt.time &gt; pd.to_datetime('12:00:00').time() &amp; df['purchase_time'] &lt; pd.to_datetime('18:00:00').time() 时出错。错误信息:unsupported operand type(s) for %: 'datetime.time' and 'datetime.time'
    • (df['purchase_time'].dt.time > pd.to_datetime('12:00:00').time()) &( df['purchase_time']
    【解决方案4】:

    您可能不需要在这里进行转换,只需按字典顺序比较时间 -

    df[df['purchase_time'].str.split().str[1] < '12:00:00']
    
       customer_number        purchase_time  quantity
    0               14  2007-03-01 07:06:00        10
    

    虽然,为了增加一层安全性,我建议转换为 timedelta 并进行比较 - 这些比较仍然适用于字符串(熊猫就是这样神奇)-

    df[pd.to_timedelta(
           df['purchase_time'].str.split().str[1], errors='coerce'
    ) < '12:00:00']
    
       customer_number        purchase_time  quantity
    0               14  2007-03-01 07:06:00        10
    

    【讨论】:

    • 谢谢。在熊猫中转换为数据时间的目的是什么,而我们可以处理具有对象类型的数据集?如果我想找到三月份买的篮子,我可以按照你的指示,用拆分的方法来做,对吧?
    • @Homesand 在这种情况下,转换为日期时间将非常有用。你可以很容易地做到pd.to_datetime(df['purchase_time']).dt.month == 3
    猜你喜欢
    • 2020-06-02
    • 2021-11-05
    • 2020-10-02
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2020-04-23
    • 2019-06-06
    • 2020-06-24
    相关资源
    最近更新 更多