【问题标题】:How can I count rows with datetime64[ns] data using pandas?如何使用 pandas 计算包含 datetime64[ns] 数据的行数?
【发布时间】:2020-07-02 18:05:17
【问题描述】:

我有一个数据框,其中的列包含 datetime64[ns] 格式的数据。 在此列中,我想计算所有有日期的行。 在第二步中,我想计算按年或月分组的所有条目。 数据框如下所示:

    date1       date2       date3
1   2019-08-15  2019-08-15  NaT
2   2019-08-29  2019-09-03  2019-10-15
3   2019-09-11  2019-09-11  NaT
4   2020-02-17  2020-02-17  NaT
5   2020-02-24  2020-02-24  2020-03-08

使用简单的.sum 函数不能像DatetimeIndex cannot perform the operation sum 那样工作 我必须将日期更改为字符串格式吗?或者我如何计算 datetime64[ns] 数据?我需要将日期设置为索引并使用.resample吗?

理想的结果是三个类似这样的数据框,a)总数,b)按年,c)按月:

    date1       date2       date3
0   5           5           2

    year   date1       date2       date3
0   2019   3           3           1
1   2020   2           2           1

    month  date1       date2       date3
0   01     NaN         NaN         NaN
1   02     2           2           NaN
2   03     NaN         NaN         1
3   04     NaN         NaN         NaN
4   05     NaN         NaN         NaN
5   06     NaN         NaN         NaN
6   07     NaN         NaN         NaN
7   08     2           1           NaN 
8   09     1           2           NaN
9   10     NaN         NaN         1
10  11     NaN         NaN         NaN
11  12     NaN         NaN         NaN


Any help would be appreciated.

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    DataFrame.resampleResampler.size 一起使用:

    df['date'] = pd.to_datetime(df['date'])
    

    df1 = df.resample('MS', on='date').size().reset_index(name='count')
    print (df1)
            date  count
    0 2019-07-01      1
    1 2019-08-01      2
    2 2019-09-01      0
    3 2019-10-01      0
    4 2019-11-01      0
    5 2019-12-01      0
    6 2020-01-01      0
    7 2020-02-01      2
    
    
    df2 = df.resample('Y', on='date').size().reset_index(name='count')
    print (df2)
            date  count
    0 2019-12-31      3
    1 2020-12-31      2
    

    编辑:

    print (df)
            date1       date2       date3  col1
    1  2019-08-15  2019-08-15         NaT     4
    2  2019-08-29  2019-09-03  2019-10-15     5
    3  2019-09-11  2019-09-11         NaT     1
    4  2020-02-17  2020-02-17         NaT     0
    5  2020-02-24  2020-02-24  2020-03-08     3
    

    首先将列转换为日期时间,如果其他列使用DataFrame.select_dtypes

    cols = ['date1','date2','date3']
    df[cols] = df[cols].apply(pd.to_datetime)
    
    df0 = df.select_dtypes('datetime')
    print (df0)
           date1      date2      date3
    1 2019-08-15 2019-08-15        NaT
    2 2019-08-29 2019-09-03 2019-10-15
    3 2019-09-11 2019-09-11        NaT
    4 2020-02-17 2020-02-17        NaT
    5 2020-02-24 2020-02-24 2020-03-08
    

    然后使用DataFrame.count获取非缺失值的数量,转换为一列DataFrame并转置为一行DataFrame:

    df1 = df0.count().to_frame().T
    print (df1)
       date1  date2  date3
    0      5      5      2
    

    对于年份和月份,DataFrame.applySeries.dt.yearSeries.value_counts 一起使用:

    df2 = df0.apply(lambda x: x.dt.year.value_counts())
    print (df2)
        date1  date2  date3
    1     NaN    NaN    NaN
    2     2.0    2.0    NaN
    3     NaN    NaN    1.0
    4     NaN    NaN    NaN
    5     NaN    NaN    NaN
    6     NaN    NaN    NaN
    7     NaN    NaN    NaN
    8     2.0    1.0    NaN
    9     1.0    2.0    NaN
    10    NaN    NaN    1.0
    11    NaN    NaN    NaN
    12    NaN    NaN    NaN
    
    df2 = df0.apply(lambda x: x.dt.month.value_counts()).reindex(range(1,13))
    print (df2)
        date1  date2  date3
    1     NaN    NaN    NaN
    2     2.0    2.0    NaN
    3     NaN    NaN    1.0
    4     NaN    NaN    NaN
    5     NaN    NaN    NaN
    6     NaN    NaN    NaN
    7     NaN    NaN    NaN
    8     2.0    1.0    NaN
    9     1.0    2.0    NaN
    10    NaN    NaN    1.0
    11    NaN    NaN    NaN
    12    NaN    NaN    NaN
    

    【讨论】:

    • 非常感谢您的快速回复。您建议的代码效果很好。我的数据集中还有 2020 年的日期。我还将修改示例数据集。你的方法给出了按年和月分组的值,我也需要。总结多年来最简单的方法是什么?
    • @Mikele - 不确定是否理解,我的代码也适用于更改的数据。
    • 它确实有效。我只是想知道在第二种方法中是否可以使用dt.year.value_counts()) 来添加每年的值?在第一种方法中,最简单的方法是将“计数”列相加。但是,我更喜欢第二种方法,因为我有一个包含多列的数据框,并且希望避免为每列引入额外的列。你明白我的意思吗?
    • @Mikele - 我添加 EDIT 来回答,但不是 100% 确定是否需要这个。
    • 太棒了。非常感谢您的帮助和时间!你是我今天的英雄!
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2019-05-23
    • 2019-12-12
    相关资源
    最近更新 更多