我在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
我怎样才能得到它?
答案 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')}