【问题标题】:Month Filtration pandas dataframe Python月过滤熊猫数据框Python
【发布时间】:2021-07-04 21:50:28
【问题描述】:

下面的代码过滤出日期以获取每个月的第一天。但是由于某种原因,它不包括每年的第一个月,例如它忽略日期'2020-01-01 00:00:00' 并直接转到'2020-02-01 00:00:00'。我该如何解决这个问题?

import numpy as np
import pandas as pd
from pandas import DataFrame

date_list = ['2019-09-01 00:00:00', '2019-10-01 00:00:00', '2019-11-01 00:00:00', '2019-11-05 00:00:00',
 '2019-12-01 00:00:00', '2020-01-04 00:00:00', '2020-01-12 00:00:00','2020-01-01 00:00:00', '2020-02-01 00:00:00', 
 '2020-03-01 00:00:00', '2020-04-01 00:00:00','2020-04-02 00:00:00', '2020-05-01 00:00:00', '2020-05-20 00:00:00',
 '2020-06-01 00:00:00', '2020-07-01 00:00:00','2020-07-03 00:00:00','2020-07-07 00:00:00', '2020-08-01 00:00:00',
 '2020-09-01 00:00:00','2020-10-01 00:00:00', '2020-11-01 00:00:00', '2020-11-04 00:00:00','2020-11-06 00:00:00',
 '2020-08-05 00:00:00','2020-12-01 00:00:00','2021-01-01 00:00:00','2021-02-01 00:00:00', '2021-03-01 00:00:00', 
 '2021-04-01 00:00:00']

data = DataFrame (date_list,columns=['Data'])
datetime = pd.to_datetime(data['Data'])

monthly_changes = data.loc[np.where(datetime.dt.month.diff().gt(0))].index.tolist()

输出:

['2019-10-01 00:00:00' '2019-11-01 00:00:00' '2019-12-01 00:00:00'
 '2020-02-01 00:00:00' '2020-03-01 00:00:00' '2020-04-01 00:00:00'
 '2020-05-01 00:00:00' '2020-06-01 00:00:00' '2020-07-01 00:00:00'
 '2020-08-01 00:00:00' '2020-09-01 00:00:00' '2020-10-01 00:00:00'
 '2020-11-01 00:00:00' '2020-12-01 00:00:00' '2021-02-01 00:00:00'
 '2021-03-01 00:00:00' '2021-04-01 00:00:00']

预期输出

'2019-09-01 00:00:00', '2019-10-01 00:00:00', '2019-11-01 00:00:00',
 '2019-12-01 00:00:00', '2020-01-01 00:00:00', '2020-02-01 00:00:00', 
 '2020-03-01 00:00:00', '2020-04-01 00:00:00', '2020-05-01 00:00:00', 
 '2020-06-01 00:00:00', '2020-07-01 00:00:00', '2020-08-01 00:00:00',
 '2020-09-01 00:00:00','2020-10-01 00:00:00', '2020-11-01 00:00:00', 
 '2020-12-01 00:00:00','2021-01-01 00:00:00','2021-02-01 00:00:00', '2021-03-01 00:00:00', 
 '2021-04-01 00:00:00'

【问题讨论】:

    标签: python-3.x pandas dataframe numpy date


    【解决方案1】:

    似乎只检查day1(第一个)会更容易:

    monthly_changes = data.loc[datetime.dt.day == 1, 'Data'].tolist()
    

    monthly_changes:

    ['2019-09-01 00:00:00', '2019-10-01 00:00:00', '2019-11-01 00:00:00',
     '2019-12-01 00:00:00', '2020-01-01 00:00:00', '2020-02-01 00:00:00',
     '2020-03-01 00:00:00', '2020-04-01 00:00:00', '2020-05-01 00:00:00',
     '2020-06-01 00:00:00', '2020-07-01 00:00:00', '2020-08-01 00:00:00',
     '2020-09-01 00:00:00', '2020-10-01 00:00:00', '2020-11-01 00:00:00',
     '2020-12-01 00:00:00', '2021-01-01 00:00:00', '2021-02-01 00:00:00',
     '2021-03-01 00:00:00', '2021-04-01 00:00:00']
    

    编辑:根据cmets,测试时间是否也是00:00:00

    from datetime import time
    
    monthly_changes = data.loc[
        datetime.dt.day == 1 &
        datetime.dt.time.eq(time(hour=0, minute=0, second=0)),
        'Data'
    ].tolist()
    

    monthly_changes:

    ['2019-09-01 00:00:00', '2019-10-01 00:00:00', '2019-11-01 00:00:00',
     '2019-12-01 00:00:00', '2020-01-01 00:00:00', '2020-02-01 00:00:00',
     '2020-03-01 00:00:00', '2020-04-01 00:00:00', '2020-05-01 00:00:00',
     '2020-06-01 00:00:00', '2020-07-01 00:00:00', '2020-08-01 00:00:00',
     '2020-09-01 00:00:00', '2020-10-01 00:00:00', '2020-11-01 00:00:00',
     '2020-12-01 00:00:00', '2021-01-01 00:00:00', '2021-02-01 00:00:00',
     '2021-03-01 00:00:00', '2021-04-01 00:00:00']
    

    为什么上述方法不起作用?

    查看中间步骤:

    datetime = pd.to_datetime(data['Data'])
    data['month'] = datetime.dt.month
    data['diff'] = datetime.dt.month.diff()
    
                       Data  month  diff
    0   2019-09-01 00:00:00      9   NaN
    1   2019-10-01 00:00:00     10   1.0
    2   2019-11-01 00:00:00     11   1.0
    3   2019-11-05 00:00:00     11   0.0
    4   2019-12-01 00:00:00     12   1.0
    5   2020-01-04 00:00:00      1 -11.0  # 1 - 12 !> 0
    

    【讨论】:

    • 我有 1 分钟的数据,类似于'2019-09-01 00:00:00', '2019-10-01 00:01:00'我试图做month_changes = data1.loc[datetime.dt.day == 1 and datetime.dt.minute == 0, 'Date'].index.tolist(),但这不起作用。由于在一分钟内的数据每月将有 1440 个值,因此我也必须按分钟过滤掉。
    • 你想要& 而不是and。此外,最好测试它是“00:00:00”,而不仅仅是分钟“0”,因为它也会匹配“01:00:00”。查看编辑@tonyselcuk
    • 另外我不知道您的实际数据框是否与提供的不同,但 provided 数据框的index 是一个范围索引。日期值位于名为 Data 的列中
    • 谢谢你解释得很好,很有帮助
    【解决方案2】:

    我建议不要使用日期时间作为你的系列名称,因为它很常见:

    from datetime import datetime
    

    不管怎样,关于你的问题

    monthly_changes = data.loc[(datetime.dt.month!=datetime.shift(1).dt.month)].index.tolist()
    

    解释只是 shift 将行向前移动一个,然后对于上个月不同的索引,您将得到 True。

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2019-04-13
      • 2015-05-28
      • 2018-02-06
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      相关资源
      最近更新 更多