不确定是否相关,但是日期在Python 3.6的熊猫中的DatetimeIndex list(?)中
我正在尝试获取连续几天的所有日期范围,输出所述日期范围的最小值和最大值。
输出最好放在列表中,但我认为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,然后检查日期,月份和年份。但是,有什么更好的方法呢?
谢谢
编辑以澄清
答案 0 :(得分:0)
让我们创建示例:
输入:
TextBox
l = ['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06']
idx = pd.DatetimeIndex(l)
解决方案:
创建一个助手系列,该助手系列将计算连续日期之间的difference
并创建差异不为1的组,然后遍历各组并获得该组中的第一项和最后一项。
DatetimeIndex(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05',
'2002-10-05', '2002-10-06'],
dtype='datetime64[ns]', freq=None)
输出:
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)]
如果您希望数据框执行[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.to_excel(..)
列表创建一个数据框:
final
答案 1 :(得分:0)
设置:
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'])
解决方案:
首先计算运行差异,创建一个标志以指示日期是否应该在同一组中,然后使用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