【问题标题】:Checking minute intervals using Pandas Datetime Python使用 Pandas Datetime Python 检查分钟间隔
【发布时间】:2022-01-06 09:18:43
【问题描述】:

我想编写一段代码来检查给定的日期值是否是一个月的第一分钟,例如x-x-01T00:00:00Z。我想实现下面给出的布尔函数。我如何能够修改下面的代码以便能够做到这一点?

import datetime
import pandas as pd 
import numpy 

def dates(date_vals):
    datetime = pd.to_datetime(date_vals)
    
    for x in date_vals:
        #Condition that l;ooss for if it is the first day and the minute of the month 
        #Is the dates format x-x-01T00:00:00Z
        
dates(np.array(['2015-10-08T13:40:00Z', '2016-01-04T21:00:00Z', '2015-10-01T00:00:00Z', '2015-10-08T00:00:00Z']))

预期输出:

False
False
True
False

【问题讨论】:

  • 不应该是[False, False, True, True]吗?为什么不是最后一个True
  • 当你说“喜欢'x-x-01T00:00:00Z'”时,秒数重要吗?或者“'x-x-01T00:00:42Z'”也应该有效?
  • 时区在这里是否相关?
  • 你想要True 还是False 来换取'2015-10-01T00:00:01Z'

标签: python pandas numpy date datetime


【解决方案1】:

这应该可行:

import datetime
import pandas as pd
import numpy as np
example = np.array(['2015-10-08T13:40:00Z', '2016-01-04T21:00:00Z', '2015-10-01T00:00:00Z', '2015-10-08T00:00:00Z'])
def my_dates_fun(date_vals):
    datetime_conversion = pd.to_datetime(date_vals)
    return (datetime_conversion.day == 1) & (datetime_conversion.hour == 0) & (datetime_conversion.minute == 0)
print(my_dates_fun(example))

输出:

[False False  True False]

【讨论】:

    【解决方案2】:

    只需设置一个布尔掩码:

    dates = pd.to_datetime(['2015-10-08T13:40:00Z', '2016-01-04T21:00:00Z', '2015-10-01T00:00:00Z', '2015-10-08T00:00:00Z'])
    
    mask = (dates.day == 1) & (dates.hour == 0) & (dates.minute == 0)
    

    更简单的掩码是使用strftime 方法仅过滤日、小时和分钟,并查找第一天、0 小时、0 分钟的日期时间:

    mask = dates.strftime('%d %H:%M') == '01 00:00'
    

    输出:

    array([False, False,  True, False])
    

    【讨论】:

      【解决方案3】:

      另一种方法是 "floor" 日期:

      dti = pd.to_datetime(np.array(['2015-10-08T13:40:00Z', '2016-01-04T21:00:00Z', 
                                     '2015-10-01T00:00:00Z', '2015-10-08T00:00:00Z']))
      
      out = dti.tz_localize(None).to_period('M').to_timestamp() == dti.tz_localize(None)
      print(out)
      
      # Output
      array([False, False,  True, False])
      

      【讨论】:

        【解决方案4】:

        我假设您想要False,如果时间戳具有非零秒/毫秒/...组件,例如'2015-10-01T00:00:01Z' -> False.

        >>> dates = pd.to_datetime(['2015-10-08T13:40:00Z', '2016-01-04T21:00:00Z', '2015-10-01T00:00:00Z', '2015-10-08T00:00:00Z', '2015-10-01T00:00:01Z'])
        >>> dates.to_period('M').to_timestamp() == dates.tz_localize(None)
        array([False, False,  True, False, False])
        

        否则,使用

        >>> dates.to_period('M').to_timestamp() == dates.floor('min').tz_localize(None)
        array([False, False,  True, False,  True]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-06
          • 2014-01-26
          • 1970-01-01
          • 1970-01-01
          • 2021-03-06
          • 2020-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多