Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有一种方法可以通过执行函数来迭代时间序列?_Python_Pandas_Function_Datetime - Fatal编程技术网

Python 有没有一种方法可以通过执行函数来迭代时间序列?

Python 有没有一种方法可以通过执行函数来迭代时间序列?,python,pandas,function,datetime,Python,Pandas,Function,Datetime,我创建了一个描述季节性的自定义函数,并希望通过将该函数应用于数据帧中的一系列datetime对象,向数据帧添加一个新列。我试图创建一个列表,其中包含应用于数据框中日期的date_season函数的值 下面的date_season函数中的所有变量都是datetime.date类型,但“dif”是datetime.timedelta 以下是函数: import datetime as dt import pandas as pd def date_season(date): year =

我创建了一个描述季节性的自定义函数,并希望通过将该函数应用于数据帧中的一系列datetime对象,向数据帧添加一个新列。我试图创建一个列表,其中包含应用于数据框中日期的date_season函数的值

下面的date_season函数中的所有变量都是datetime.date类型,但“dif”是datetime.timedelta

以下是函数:

import datetime as dt
import pandas as pd

def date_season(date):
    year = date.year
    min_season = dt.date(year,1,1)
    max_season = dt.date(year,6,30)
    dif = abs(max_season - date)
    dif_days = dif.days
    x = (((max_season - min_season).days) - dif.days * 2) / (max_season - min_season).days
    seasonality = np.sin(x * (np.pi) / 2)
    return(seasonality)
以下是熊猫数据框的创建方式:

start = dt.date(2017,1,1)
end = dt.date(2019,12,31)
df = pd.DataFrame({'Date': pd.date_range(start, end, freq="D")})
正在尝试使用季节性参数创建新列表:

z = []
for index, row in df.iterrows():
    z.append(date_season(row.Date))
这将返回错误消息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-105-63e9cb35ed55> in <module>()
      1 z = []
      2 for index, row in df.iterrows():
----> 3     z.append(date_season(row.Date))

<ipython-input-71-5e2b35e24e38> in date_season(date)
      3     min_season = dt.date(year,1,1)
      4     max_season = dt.date(year,6,30)
----> 5     dif = abs(max_season - date)
      6     dif_days = dif.days
      7     x = (((max_season - min_season).days) - dif.days * 2) / (max_season - min_season).days

pandas\_libs\tslibs\timestamps.pyx in 
pandas._libs.tslibs.timestamps._Timestamp.__sub__()

TypeError: descriptor '__sub__' requires a 'datetime.datetime' object but received a 'datetime.date'
返回

AttributeError: ("'Series' object has no attribute 'year'", 'occurred at index Date')

不确定为什么它需要datetime.datetime对象,因为该函数使用datetime.date格式的单个输入。是否有一种更简单的方法来遍历日期并使用此函数的结果创建一个新列?

您需要将min_season和max_season定义为pandas datetime对象,而不是内置的python datetime类。这令人困惑,但它们并不完全可以互换

def date_season(date):
    year = date.year
    #use pandas.datetime
    min_season = pd.datetime(year,1,1)
    max_season = pd.datetime(year,6,30)
    dif = abs(max_season - date)
    dif_days = dif.days
    x = (((max_season - min_season).days) - dif.days * 2) / (max_season - min_season).days
    seasonality = np.sin(x * (np.pi) / 2)
    return(seasonality)
现在,您可以对整个数据帧使用applymap,也可以对单个列使用apply

new_df = df.applymap(date_season)


调用df.apply将把函数应用于df中的每一列。您的函数接受单个datetime对象作为输入。您需要做的是使用
df.applymap(date\u season)
(如果所有列都是datetime对象),否则您需要应用于单个列,例如
df['date\u column']。apply(date\u season)
。太棒了!这很有效。非常感谢您的回复!
new_df = df.applymap(date_season)
df['Date'].apply(date_season)