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

mar*_*ion 6 python datetime time-series pandas

我有Pandas DataFrame,有近3,000,000行.其中一列被调用TIMESTAMP,而datetime64类型.时间戳格式如下:

2015-03-31 22:56:45.510
Run Code Online (Sandbox Code Playgroud)

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

(df.TIMESTAMP.max() - df.TIMESTAMP.min()).days
Run Code Online (Sandbox Code Playgroud)

然而,它发生在我身上可能并不总是正确的,因为不能保证每天收集数据.相反,我尝试使用map和计算时间戳系列中的独特日期apply,并且两者都花费相当多的时间来处理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
Run Code Online (Sandbox Code Playgroud)

有没有办法加速这种计算,或者是一种完全不同但更好的方法?

谢谢!

And*_*den 8

要获得您应该首先获得的独特日期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]')
Run Code Online (Sandbox Code Playgroud)

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

要获得计数可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)