Pandas:时间戳系列中的唯一天数

Posted

技术标签:

【中文标题】Pandas:时间戳系列中的唯一天数【英文标题】:Pandas: Number of unique days in a timestamp Series 【发布时间】:2016-02-11 20:34:55 【问题描述】:

我有将近 3,000,000 行的 Pandas DataFrame。其中一列称为TIMESTAMP,属于datetime64 类型。时间戳格式如下:

2015-03-31 22:56:45.510

我的目标是计算收集数据的天数。我最初的方法很简单:

(df.TIMESTAMP.max() - df.TIMESTAMP.min()).days

但是,我发现这可能并不总是正确的,因为不能保证每天都收集数据。相反,我尝试使用 mapapply 计算时间戳系列中的唯一天数,并且都需要相当长的时间来处理 3,000,000 行:

%timeit len(df['TIMESTAMP'].map(lambda t: t.date()).unique())
1 loops, best of 3: 41.3 s per loop

%timeit len(df['TIMESTAMP'].apply(lambda t: t.date()).unique())
1 loops, best of 3: 42.3 s per loop

有没有一种方法可以加快计算速度,或者是完全不同但更好的方法?

谢谢!

【问题讨论】:

可以尝试类似:df.groupby(pandas.TimeGrouper('D')) 然后获取组数,不确定它是否会更快,但我怀疑是这样。 【参考方案1】:

要获得唯一日期,您应该首先使用normalize(要获得当天午夜的时间,请注意这是快速),然后使用unique

In [31]: df["Time"].dt.normalize().unique()
Out[31]:
array(['2014-12-31T16:00:00.000000000-0800',
       '2015-01-01T16:00:00.000000000-0800',
       '2015-01-02T16:00:00.000000000-0800',
       '2015-01-04T16:00:00.000000000-0800',
       '2015-01-05T16:00:00.000000000-0800'], dtype='datetime64[ns]')

原始答案(我误读了问题):

要获得计数,可以使用normalize,然后使用value_counts

In [11]: df
Out[11]:
        Time
0 2015-01-01
1 2015-01-02
2 2015-01-03
3 2015-01-03
4 2015-01-05
5 2015-01-06

In [12]: df['Time'].dt.normalize().value_counts()
Out[12]:
2015-01-03    2
2015-01-06    1
2015-01-02    1
2015-01-05    1
2015-01-01    1
Name: Time, dtype: int64

但也许更简洁的选择是重新采样(尽管我不确定这是否效率较低):

In [21]: pd.Series(1, df['Time']).resample("D", how="sum")
Out[21]:
Time
2015-01-01     1
2015-01-02     1
2015-01-03     2
2015-01-04   NaN
2015-01-05     1
2015-01-06     1
Freq: D, dtype: float64

【讨论】:

谢谢! %timeit len(df['TIMESTAMP'].dt.normalize().unique()) 给了我 281 毫秒,比地图方法快 148 倍!【参考方案2】:

如果你的索引是 DateTimeIndex,我认为你可以这样做:

print(df.groupby(df.index.date).shape)

【讨论】:

时间戳是日期列,而不是索引。 将索引保持为 DateTimeIndex 是否有优势?正如@AndyHayden 所提到的,它现在只是一个专栏。

以上是关于Pandas:时间戳系列中的唯一天数的主要内容,如果未能解决你的问题,请参考以下文章

将一列时间戳转换为 pandas 中的句点

Unix时间戳转换怎样在Excel批量修改

java中的当前时间减去天数

在 pandas.Series 中将时间戳转换为 datetime.datetime

如何将时间戳转换为天数

使用 Pandas 的两个时间戳之间的每小时时间序列(以分钟为单位)