Python 有没有一种方法可以从这个连续的周期性日期时间序列中更新月平均加权值?

Python 有没有一种方法可以从这个连续的周期性日期时间序列中更新月平均加权值?,python,pandas,datetime,data-science,Python,Pandas,Datetime,Data Science,我有一个数据集,其中开始日期和日期没有特定顺序。 我想为月份和数据的加权平均值创建一组新的列 del表示日期范围内的天数 d是该时间段的平均值 from datetime import datetime my_time = datetime.min.time() from datetime import date df1['del'] = 0 for i in range(0,df1['start'].size): df1['delta'][i] = (datetime.com

我有一个数据集,其中开始日期和日期没有特定顺序。 我想为月份和数据的加权平均值创建一组新的列

del
表示日期范围内的天数

d
是该时间段的平均值

from datetime import datetime

my_time = datetime.min.time()

from datetime import date

df1['del'] = 0

for i in range(0,df1['start'].size):

    df1['delta'][i] = (datetime.combine(df1['start'][i], my_time)-datetime.combine(df1['end'][i], my_time)).days
数据如下所示-

   in       start         end   units  del  d=(units/del)
    0  2017-11-12  2017-10-10  1207.0   33      36.575758
    1  2017-12-12  2017-11-12     5.0   30      0.166666
    2   2018-01-10  2017-12-12  8855.0  29      305.344828
    3   2018-02-08  2018-01-10  3867.0  29      133.344828
    4   2018-03-09  2018-02-08  922.0   29      31.793103
我希望这是我的最终输出-

month               d_month

Nov-17              14.7
Dec-17              ....
Jan-18              ....
d_月的计算应如下所示-

   in       start         end   units  del  d=(units/del)
    0  2017-11-12  2017-10-10  1207.0   33      36.575758
    1  2017-12-12  2017-11-12     5.0   30      0.166666
    2   2018-01-10  2017-12-12  8855.0  29      305.344828
    3   2018-02-08  2018-01-10  3867.0  29      133.344828
    4   2018-03-09  2018-02-08  922.0   29      31.793103
比方说十一月-
(36.5757*12+0.166666*18)/30


其他月份也是如此。

您可以使用
pd.to\u datetime
直接进入数据帧。 对于下面的数据帧

import numpy as np
import pandas as pd
d = {
        'Start' : ['2017-11-12', '2017-12-12', '2018-01-10', '2018-02-08', '2018-03-09'],
        'End' : ['2017-10-10', '2017-11-12', '2017-12-12', '2018-01-08', '2018-02-09'],
        'Units': [1207.0, 5.0, 8855.0, 3867.0, 922.0]
    }
df = pd.DataFrame(d)
输出为

        Start         End   Units
0  2017-11-12  2017-10-10  1207.0
1  2017-12-12  2017-11-12     5.0
2  2018-01-10  2017-12-12  8855.0
3  2018-02-08  2018-01-08  3867.0
4  2018-03-09  2018-02-09   922.0
使用下面的代码

df['StartM'] = pd.to_datetime(df['Start'], format='%Y-%m-%d')
df['EndM'] = pd.to_datetime(df['End'], format='%Y-%m-%d')
df['Del'] = (df['StartM'] - df['EndM']) / np.timedelta64(1, 'D')
df['month'] = df['StartM'].dt.strftime('%b-%y')
df['d'] = df['Units'] / df['Del']
df['d_month'] = (df['d'] * 12 + 0.166666*18) / 30
df.drop('StartM', 1, inplace=True)
df.drop('EndM', 1, inplace=True)
df
这将导致以下输出

Start   End     Units   Del     month   d   d_month
0   2017-11-12  2017-10-10  1207.0  33.0    Nov-17  36.575758   14.730303
1   2017-12-12  2017-11-12  5.0     30.0    Dec-17  0.166667    0.166666
2   2018-01-10  2017-12-12  8855.0  29.0    Jan-18  305.344828  122.237931
3   2018-02-08  2018-01-08  3867.0  31.0    Feb-18  124.741935  49.996774
4   2018-03-09  2018-02-09  922.0   28.0    Mar-18  32.928571   13.271428

您可以使用
pd.to\u datetime
直接进入数据帧。 对于下面的数据帧

import numpy as np
import pandas as pd
d = {
        'Start' : ['2017-11-12', '2017-12-12', '2018-01-10', '2018-02-08', '2018-03-09'],
        'End' : ['2017-10-10', '2017-11-12', '2017-12-12', '2018-01-08', '2018-02-09'],
        'Units': [1207.0, 5.0, 8855.0, 3867.0, 922.0]
    }
df = pd.DataFrame(d)
输出为

        Start         End   Units
0  2017-11-12  2017-10-10  1207.0
1  2017-12-12  2017-11-12     5.0
2  2018-01-10  2017-12-12  8855.0
3  2018-02-08  2018-01-08  3867.0
4  2018-03-09  2018-02-09   922.0
使用下面的代码

df['StartM'] = pd.to_datetime(df['Start'], format='%Y-%m-%d')
df['EndM'] = pd.to_datetime(df['End'], format='%Y-%m-%d')
df['Del'] = (df['StartM'] - df['EndM']) / np.timedelta64(1, 'D')
df['month'] = df['StartM'].dt.strftime('%b-%y')
df['d'] = df['Units'] / df['Del']
df['d_month'] = (df['d'] * 12 + 0.166666*18) / 30
df.drop('StartM', 1, inplace=True)
df.drop('EndM', 1, inplace=True)
df
这将导致以下输出

Start   End     Units   Del     month   d   d_month
0   2017-11-12  2017-10-10  1207.0  33.0    Nov-17  36.575758   14.730303
1   2017-12-12  2017-11-12  5.0     30.0    Dec-17  0.166667    0.166666
2   2018-01-10  2017-12-12  8855.0  29.0    Jan-18  305.344828  122.237931
3   2018-02-08  2018-01-08  3867.0  31.0    Feb-18  124.741935  49.996774
4   2018-03-09  2018-02-09  922.0   28.0    Mar-18  32.928571   13.271428

嘿,谢谢你的输入,但是-df['d'u month']=(df['d']*12+0.166666*18)/30(11月)有效,因为我11月的12天是从第一个索引开始的,11月的18天是从第二个索引开始的。我想从提供的非结构化日期范围中找出每个月的加权平均值。例如,如果从第一个范围开始计算11月的14天,从下一个范围开始计算最后16天,则计算结果为(36.5757*14+0.166*16)/30 del表示日期范围内的天数,d是该时间段的平均值。我想从这个连续的周期数据中获得月平均值。嘿,谢谢你的输入,但是-df['d'u month']=(df['d']*12+0.166666*18)/30(11月)有效,因为我11月的12天来自第一个指数,11月的18天来自第二个指数。我想从提供的非结构化日期范围中找出每个月的加权平均值。例如,如果从第一个范围开始计算11月的14天,从下一个范围开始计算最后16天,则计算结果为(36.5757*14+0.166*16)/30 del表示日期范围内的天数,d是该时间段的平均值。我想从这个连续的周期数据中获得月平均值。