如何在给定的datetime64值范围内错过日期?

时间:2018-01-31 14:00:18

标签: python pandas datetime

我在Pandas中有以下DataFrame df

dti                  id_n
2016-07-27 13:55:00  1
2016-07-29 13:50:07  1
2016-07-29 14:50:08  1
2016-07-30 23:50:01  2
2016-08-01 12:50:00  3
2016-08-02 12:50:00  3

dti的类型为datetime64。 我希望获得result的{​​{1}}和min值之间错过日期的新DataFrame max

result =

dti

我怎样才能得到它?

2 个答案:

答案 0 :(得分:4)

使用floor删除时间,然后创建date_range并获取difference

d = df['dti'].dt.floor('d')
print (d)
0   2016-07-27
1   2016-07-29
2   2016-07-29
3   2016-07-30
4   2016-08-01
5   2016-08-02
Name: dti, dtype: datetime64[ns]

a = pd.date_range(d.min(), d.max(), freq='d')
print (a)
DatetimeIndex(['2016-07-27', '2016-07-28', '2016-07-29', '2016-07-30',
               '2016-07-31', '2016-08-01', '2016-08-02'],
              dtype='datetime64[ns]', freq='D')

b = a.difference(d)
print (b)
DatetimeIndex(['2016-07-28', '2016-07-31'], dtype='datetime64[ns]', freq=None)

df1 = pd.DataFrame({'missing':a.difference(d)})
print (df1)
     missing
0 2016-07-28
1 2016-07-31

另一种解决方案是按mean缩减采样并获取NaN s值的索引:

a = df.resample('d', on='dti').mean()
print (a)
            id_n
dti             
2016-07-27   1.0
2016-07-28   NaN
2016-07-29   1.0
2016-07-30   2.0
2016-07-31   NaN
2016-08-01   3.0
2016-08-02   3.0

b = a.index[a['id_n'].isnull()]
print (b)
DatetimeIndex(['2016-07-28', '2016-07-31'], dtype='datetime64[ns]', name='dti', freq=None)

答案 1 :(得分:0)

这是另一种解决方案,用于比较。我使用normalize()删除时间并执行set比较。

import pandas as pd

df = pd.DataFrame([['2016-07-27 13:55:00', 1], ['2016-07-29 13:50:07', 1],
                   ['2016-07-29 14:50:08', 1], ['2016-07-30 23:50:01', 2],
                   ['2016-08-01 12:50:00', 3], ['2016-08-02 12:50:00', 3]],
                  columns=['dti', 'id_n'])

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

full = set(pd.to_datetime(pd.date_range(df['dti'].dt.date.min(), df['dti'].dt.date.max(), normalize=True)))
select = set(df['dti'].dt.normalize())

full - select

# {Timestamp('2016-07-28 00:00:00', freq='D'),
#  Timestamp('2016-07-31 00:00:00', freq='D')}