【问题标题】:How to check if its a new day in python?如何检查它是否是python中的新一天?
【发布时间】:2020-09-27 14:34:04
【问题描述】:

我有一个使用 pandas 的函数 date_range 创建的日期列表。在该列表中,日期从 01 January 2019 00:00:0031 December 2019 00:00:00。现在每个时间间隔有15分钟的间隔,所以一天总共会有96个15分钟的块((24*60)/15)。所以列表会是这样的:

modelStartDate = "01/01/2019"
modelEndDate = "31/12/2019"
interval = 15
dateTime = pd.date_range(start=modelStartDate, end=modelEndDate, freq=str(interval) + 'min')

print(dateTime)

输出:

DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 00:15:00',
               '2019-01-01 00:30:00', '2019-01-01 00:45:00',
               '2019-01-01 01:00:00', '2019-01-01 01:15:00',
               '2019-01-01 01:30:00', '2019-01-01 01:45:00',
               '2019-01-01 02:00:00', '2019-01-01 02:15:00',
               ...
               '2019-12-30 21:45:00', '2019-12-30 22:00:00',
               '2019-12-30 22:15:00', '2019-12-30 22:30:00',
               '2019-12-30 22:45:00', '2019-12-30 23:00:00',
               '2019-12-30 23:15:00', '2019-12-30 23:30:00',
               '2019-12-30 23:45:00', '2019-12-31 00:00:00'],
              dtype='datetime64[ns]', length=34945, freq='15T')

所以我正在做一些需要一些计数器的计算,我想做的是我想在每个新的一天重置计数器。所以做这个任务我有两种方法:首先,我可以简单地将列表分成 96 个块,并在每 96 个块后重置计数器;其次,我想查看这个列表,看看实际什么时候是新的日子并重置柜台只有当它发现有新的一天。 第一种方法:

modelStartDate = "01/01/2019"
modelEndDate = "31/12/2019"
interval = 15
dateTime = pd.date_range(start=modelStartDate, end=modelEndDate, freq=str(interval) + 'min')

for i in range(len(dateTime)):
    if i % 96 == 0:
        print("new date at ", i)

第二种方法: 我不知道该怎么做。所以有人可以帮忙。在所需的输出中,我不想要任何特别的东西,只是可以简单地说那是新一天的新日期。所以在每第 96 个块输出之后会是这样的:

new date: 02/01/2019 00:00:00
new date: 03/ 01/2019 00:00:00
and so on

【问题讨论】:

    标签: python pandas list datetime


    【解决方案1】:

    您可以使用 Timestamp.round() 函数将日期时间值与其四舍五入的对应值进行比较,如果为真,则计数器重置。

    modelStartDate = "01/01/2019"
    modelEndDate = "31/12/2019"
    interval = 15
    dateTime = pd.date_range(start=modelStartDate, end=modelEndDate, freq=str(interval) + 'min')
    
    counter = 0
    for i in dateTime:
        # Do your calculations
        counter+=1  # Counter value incrementing
    
        if i == i.round(freq='D'):  # Check if its the start of the day
            counter = 0  # Reset the counter
            print("New Date at {}".format(i))
    

    【讨论】:

    • 不错的解决方案。您能否添加代码如何使用数据框实现这一点?
    【解决方案2】:

    您可以使用 DatetimeIndex 的 dayofyear 方法。每当它改变时,你就有新的一天。例如:

    import pandas as pd
    
    modelStartDate, modelEndDate = "01/01/2019", "31/12/2019"
    interval = 15
    dateTime = pd.date_range(start=modelStartDate, end=modelEndDate, freq=str(interval) + 'min')
    
    doy = pd.Series(dateTime.dayofyear)
    m = doy.ne(doy.shift())
    
    dateTime[m]
    # DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
    #                '2019-01-05', '2019-01-06', '2019-01-07', '2019-01-08',
    #                '2019-01-09', '2019-01-10',
    #                ...
    #                '2019-12-22', '2019-12-23', '2019-12-24', '2019-12-25',
    #                '2019-12-26', '2019-12-27', '2019-12-28', '2019-12-29',
    #                '2019-12-30', '2019-12-31'],
    #               dtype='datetime64[ns]', length=365, freq=None)
    

    要得到你描述的'计数器',你可以使用Cumsum reset at NaN,稍微修改一下并使用

    v = (~m).astype(int)
    cumsum = v.cumsum()
    reset = -cumsum[v == 0].diff().fillna(cumsum)
    counting = v.where(v != 0, reset).cumsum()
    # counting
    # 0         0
    # 1         1
    # 2         2
    # 3         3
    # 4         4
    #          ..
    # 34940    92
    # 34941    93
    # 34942    94
    # 34943    95
    # 34944     0
    # Length: 34945, dtype: int64
    

    【讨论】:

      【解决方案3】:

      这对我有用,但可能不像熊猫:

      modelStartDate = "01/01/2019"
      modelEndDate = "31/12/2019"
      interval = 15
      dateTime = pd.date_range(start=modelStartDate, end=modelEndDate)
      dateTime_min = pd.date_range(start=modelStartDate, end=modelEndDate, freq=str(interval) + 'min')
      df_combined = pd.DataFrame({"date_frequency":dateTime_min})
      df_final = pd.DataFrame()
      for date in dateTime:
          df_final = df_final.append(df_combined[df_combined['date_frequency'].dt.strftime('%d/%m/%Y') == date.strftime('%d/%m/%Y')].reset_index())
          display(df_final)
      

      输出:

          index   date_frequency
      0     0     2019-01-01 00:00:00
      1     1     2019-01-01 00:15:00
      2     2     2019-01-01 00:30:00
      3     3     2019-01-01 00:45:00
      4     4     2019-01-01 01:00:00
      ...     ...     ...
      91  187     2019-01-02 22:45:00
      92  188     2019-01-02 23:00:00
      93  189     2019-01-02 23:15:00
      94  190     2019-01-02 23:30:00
      95  191     2019-01-02 23:45:00
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-02
        • 1970-01-01
        • 2021-05-17
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多