首页 > 解决方案 > 从熊猫日期时间变量日和月获取

问题描述

我在带有列 [Index = Date, Data] 的 pandas 数据框中有 40 年的每日数据,我想从每个月中提取数据,并按照下面代码中显示的顺序对包含在天数中的数据进行累积总和,即意味着我必须重复该代码 12 次(即每个月)。

我想知道是否有一种更有效的编码方式,而不必重复多次。

def datos_por_dias(precipitacion):

    datos_final = precipitacion


    datos_enero1 = np.array([])
    datos_enero2 = np.array([])
    datos_enero3 = np.array([])
    datos_enero4 = np.array([])


    comienzo = time.time()

    for i in groupsY.year:
        datos_enero1 = np.append([[datos_enero1]], [[np.sum(datos_final[(datos_final.index.day <= 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero1 = np.append([[datos_enero1]], [[np.sum(datos_final[(datos_final.index.day > 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])


    final = time.time()
    print(final - comienzo)

    comienzo = time.time()
    for i in groupsY.year:
        datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 15) & (datos_final.index.day <= 23) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 23) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])

    final = time.time()
    print(final - comienzo)


    comienzo = time.time()
    for i in groupsY.year:
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day <= 4) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 4) & (datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 12) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 12) & (datos_final.index.day <= 16) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 16) & (datos_final.index.day <= 20) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 20) & (datos_final.index.day <= 24) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 24) & (datos_final.index.day <= 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])

    final = time.time()
    print(final - comienzo)


    comienzo = time.time()
    for i in groupsY.year:
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day <= 2) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 2) & (datos_final.index.day <= 4) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 4) & (datos_final.index.day <= 6) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 6) & (datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 10) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 10) & (datos_final.index.day <= 12) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 12) & (datos_final.index.day <= 14) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 14) & (datos_final.index.day <= 16) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 18) & (datos_final.index.day <= 20) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 22) & (datos_final.index.day <= 24) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 26) & (datos_final.index.day <= 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 28) & (datos_final.index.day <= 30) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])

        datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 30)  & (datos_final.index.month==1) & (datos_final.index.year==i)])]])

    final = time.time()
    print(final - comienzo)

    pE = datos_final.loc[(datos_final.index.month==1)]


    return (datos_enero1, datos_enero2, datos_enero3, datos_enero4, 
            pE)

数据片段如下所示

[Clip of daily data][1]

这是我的数据

年份数据对应for循环中的数据即groupsY DataFramefor i in groupsY.year

组剪辑Y

我想得到下面显示的结果(这是第一个 for 循环,即将月份分成两部分,并对每部分中的数据进行累积总和)

想要的结果

谢谢你的帮助。

标签: pythonpandaspython-datetime

解决方案


这是一种可以帮助您入门的方法 - 您的函数似乎返回一个数据元组,但您粘贴的内容看起来不同,因此您仍然需要使用所需的确切格式。

# create mock data

index=pd.DatetimeIndex(start='1/1/1962',end='1/1/1966',freq='D')

data=pd.DataFrame(data={'Datos':np.random.choice(range(11),size=index.shape[0]),'Date':index})
Date    Datos

data.head()
0   1962-01-01  7
1   1962-01-02  3
2   1962-01-03  0
3   1962-01-04  7
4   1962-01-05  9

然后我提取关键日期组件(年、月、日) - 我注意到您在 16 日之前和之后将月份分成大块,包括 2 月,一个较短的月份,所以我只是在第 16 天拆分月份。

data['day']=data.Date.dt.day
data['year']=data.Date.dt.year
data['month']=data.Date.dt.month
data['DateGroup']=(data.day<17).map({True:'First Half',False:'Second Half'})

然后,您的累积总和看起来只是每个半月组的总和,所以我们通过 求和yearmonth然后DateGroup得到:

data.groupby(['year','month','DateGroup']).Datos.sum().head(6)

year  month  DateGroup  
1962  1      First Half      83
             Second Half     73
      2      First Half     100
             Second Half     37
      3      First Half      81
             Second Half     71

推荐阅读