这个功能(季节)运行时间太长,为啥?以及如何改进代码?

Posted

技术标签:

【中文标题】这个功能(季节)运行时间太长,为啥?以及如何改进代码?【英文标题】:This function (season) takes too much time to run, why ? and how can I improve the code?这个功能(季节)运行时间太长,为什么?以及如何改进代码? 【发布时间】:2020-04-17 16:27:20 【问题描述】:

这个功能(季节)运行时间太长,为什么?以及如何改进代码?

这是函数

def season_of_date(date):
    date=pd.to_datetime(date)
    x=date.year
    year = str(x)
    seasons = 'spring': pd.date_range(start='21/03/'+year, end='20/06/'+year),
               'summer': pd.date_range(start='21/06/'+year, end='22/09/'+year),
               'autumn': pd.date_range(start='23/09/'+year, end='20/12/'+year)
    if date in seasons['spring']:
        return 'spring'
    if date in seasons['summer']:
        return 'summer'
    if date in seasons['autumn']:
        return 'autumn'
    else:
        return 'winter'

#I applied it to my dataset named dat
data['season'] = data.DateTime.map(season_of_date)

【问题讨论】:

【参考方案1】:

很难确切知道发生了什么,因为您没有发布数据框的一些示例行。

如果目标是从名为“DateTime”的列中确定季节,那么我认为下面的代码更有效,因为它避免了不必要地为每一行生成日期范围,然后测试日期是否在该范围内。请注意,如果您使用的是 Python 3.5 或更低版本,则阈值应为 OrderedDict,因为代码依赖于键顺序。

import datetime

def season_of_date(date):
    '''Assuming applied to column with dtype datetimens[64]'''
    year = date.year
    thresholds = 'autumn': datetime.date(year, 9, 1),
                  'summer': datetime.date(year, 6, 1),
                  'spring': datetime.date(year, 3, 1)
    for season, threshold in thresholds.items():
        if date >= threshold:
            return season
    return 'winter'

因此,将此函数应用于示例数据集,结果如下

df = pd.DataFrame('dates': pd.date_range('11/21/2019', periods=20, freq='W'))
df['dates'].apply(season_of_date)

0     autumn
1     autumn
2     autumn
3     autumn
4     autumn
5     autumn
6     winter
7     winter
8     winter
9     winter
10    winter
11    winter
12    winter
13    winter
14    spring
15    spring
16    spring
17    spring
18    spring
19    spring
Name: dates, dtype: object

【讨论】:

以上是关于这个功能(季节)运行时间太长,为啥?以及如何改进代码?的主要内容,如果未能解决你的问题,请参考以下文章

【时间序列分析】为啥要做季节调整?对数处理?差分?(理论篇)

为啥这个值对于我的 H2 表来说太长了

如何清除缓存,以及为啥要清理缓存?

C++ 唯一指针;为啥这个示例代码会出现编译错误?错误代码太长了,我无法指定

为啥这个 SPARQL 查询超时以及如何优化这个查询?

laravel 5.4 指定的key太长,为啥数字191