Python Panda Datetimes:从日期时间列表中获取日期时间范围

Python Panda Datetimes:从日期时间列表中获取日期时间范围,python,pandas,datetime,python-3.6,Python,Pandas,Datetime,Python 3.6,不确定是否相关,但日期在Panda、Python 3.6中的DatetimeIndex列表(?)中 我试图获得连续几天的所有日期范围,输出所述日期范围的最小值和最大值 输出首选在列表中,但我认为Dataframe本质上是一个可以使用索引的列表? 稍后,我会将这些日期范围输出到Excel工作表中 样本输入: '1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06' 预期产出: 1990

不确定是否相关,但日期在Panda、Python 3.6中的DatetimeIndex列表(?)中

我试图获得连续几天的所有日期范围,输出所述日期范围的最小值和最大值

输出首选在列表中,但我认为Dataframe本质上是一个可以使用索引的列表?
稍后,我会将这些日期范围输出到Excel工作表中

样本输入:

'1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'  
预期产出:

1990-10-01, 1990-10-03  
1990-10-05   
2002-10-05, 2002-10-06    
我知道一个简单的方法是执行for循环,检查下一个/上一个日期是否偏离1,检查日期、月份和年份。但是,有什么更好的方法可以做到这一点呢

谢谢


编辑以澄清

让我们创建以下示例:

输入:

l = ['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06']
idx = pd.DatetimeIndex(l)
[DatetimeIndex(['1990-10-01', '1990-10-03'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['1990-10-05'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['2002-10-05', '2002-10-06'], dtype='datetime64[ns]', freq=None)]
df = pd.DataFrame()

df['Date'] =  pd.to_datetime(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'])


解决方案:

创建一个助手系列,该系列将计算连续日期之间的差异,并创建差异不为1的组,然后在组上循环并获取该组中的第一个和最后一个项目

g = idx.to_series().diff().fillna(pd.Timedelta(days=1)).dt.days.ne(1).cumsum()

final = [pd.DatetimeIndex(map(grp.index.__getitem__, (0,-1))) 
                         if len(grp.index)>1 else grp.index
                         for _,grp in g.groupby(g)]

输出:

l = ['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06']
idx = pd.DatetimeIndex(l)
[DatetimeIndex(['1990-10-01', '1990-10-03'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['1990-10-05'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['2002-10-05', '2002-10-06'], dtype='datetime64[ns]', freq=None)]
df = pd.DataFrame()

df['Date'] =  pd.to_datetime(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'])
如果您想要一个数据框执行
df.to_excel(..)
,只需根据
最终
列表创建一个数据框:

df = pd.DataFrame(final,columns = ['start','end'])
print(df)

       start        end
0 1990-10-01 1990-10-03
1 1990-10-05        NaT
2 2002-10-05 2002-10-06

设置:

l = ['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06']
idx = pd.DatetimeIndex(l)
[DatetimeIndex(['1990-10-01', '1990-10-03'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['1990-10-05'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['2002-10-05', '2002-10-06'], dtype='datetime64[ns]', freq=None)]
df = pd.DataFrame()

df['Date'] =  pd.to_datetime(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'])
解决方案:

l = ['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06']
idx = pd.DatetimeIndex(l)
[DatetimeIndex(['1990-10-01', '1990-10-03'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['1990-10-05'], dtype='datetime64[ns]', freq=None),
 DatetimeIndex(['2002-10-05', '2002-10-06'], dtype='datetime64[ns]', freq=None)]
df = pd.DataFrame()

df['Date'] =  pd.to_datetime(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'])
首先计算running diff,创建一个标志以指示日期是否应在同一组中,然后groupby并获取该组的开始和结束日期。如果结束日期与开始日期相同,则使用Set删除结束日期

(
    df.assign(DateDiff=(df.Date - df.Date.shift(1)).dt.days.fillna(0))
    .assign(Flag= lambda x: np.where(x.DateDiff==1, np.nan, range(len(x))))
    .assign(Flag=lambda x: x.Flag.ffill())
    .groupby(by='Flag').Date
    .apply(lambda x: set([x.iloc[0].date(), x.iloc[-1].date()]))
)

Flag
0.0    {1990-10-01, 1990-10-03}
3.0                {1990-10-05}
4.0    {2002-10-05, 2002-10-06}
Name: Date, dtype: object

为什么
'1990-10-01',1990-10-02'
不在预期输出中?@YOLO OP想要每个消费组的最早日期和最晚日期您想要以列表或数据框的形式输出吗?@YOLO抱歉,我编辑了帖子。@anky_91编辑了帖子,可能是列表,但我需要它,这样我就可以将这些日期范围输出到Excel工作表中