首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Panda datetime :从datetime列表中获取datetime范围

Panda datetime :从datetime列表中获取datetime范围
EN

Stack Overflow用户
提问于 2020-01-25 16:11:57
回答 2查看 50关注 0票数 0

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

我正在尝试获取连续日期的所有日期范围,输出上述日期范围的最小值和最大值。

输出更喜欢在列表中,但看起来Dataframe本质上是一个我可以使用索引的列表,我想?

稍后,我会将这些日期范围输出到Excel工作表中。

示例输入:

代码语言:javascript
复制
'1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06'  

预期输出:

代码语言:javascript
复制
1990-10-01, 1990-10-03  
1990-10-05   
2002-10-05, 2002-10-06    

我知道一个简单的方法是执行for循环,检查下一个/上一个日期是否相差1,检查日、月和年。但有什么更好的方法可以做到这一点呢?

谢谢

编辑以澄清

EN

回答 2

Stack Overflow用户

发布于 2020-01-25 16:31:01

让我们创建一个示例:

输入:

代码语言:javascript
复制
l = ['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05', '2002-10-05', '2002-10-06']
idx = pd.DatetimeIndex(l)

代码语言:javascript
复制
DatetimeIndex(['1990-10-01', '1990-10-02', '1990-10-03', '1990-10-05',
           '2002-10-05', '2002-10-06'],
          dtype='datetime64[ns]', freq=None)

解决方案:

创建一个帮助器序列,它将计算连续日期之间的difference,并创建差异不为1的组,然后循环遍历这些组并获取该组中的第一项和最后一项。

代码语言:javascript
复制
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)]

输出:

代码语言:javascript
复制
[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列表创建一个数据帧:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-01-25 16:42:53

设置:

代码语言:javascript
复制
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用于删除结束日期。

代码语言:javascript
复制
(
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59907492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档