繁体   English   中英

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

[英]How to get missed dates in the given range of datetime64 values?

我在熊猫中有以下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与之间错过日期minmax的价值dti

结果=

2016-07-28
2016-07-31

我怎么才能得到它?

使用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)

这是另一个解决方案,用于比较。 我使用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')}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM