簡體   English   中英

使用 date_range 按月分發數據 - 改進解決方案

[英]Distribute out data on month using date_range - improve solution

我有 dataframe(下面的 df)和兩個日期列,DATE_IN 和 DATE_OUT。 我想按月 (df_target) 分發此數據。 df_target 有兩列,PERIOD 由 df 中的所有包含日期組成,'n' 設置為零。

這個想法很簡單。 如果一個 ID 的日期范圍是 12 個月,比如 2015 年 7 月到 2016 年 7 月之間。那么我想在 df_target 中的每個相應月份加 1。

import pandas as pd
from datetime import datetime
from datetime import timedelta
import numpy as np

df=pd.DataFrame({'ID': range(0,10),
              'DATE_IN':['2015-05-23', '2016-08-13', '2014-06-13', '2014-03-19', '2013-01-13',
                        '2014-03-13', '2014-04-27', '2014-02-13', '2015-03-03', '2016-03-13'],
              'DATE_OUT':['2015-08-12', '2017-09-30', '2017-05-17', '2015-12-24', '2015-02-15',
                        '2017-03-19', '2016-02-20', '2015-01-10', '2015-09-21', '2016-04-23'],
              'CODE':[10,10,10,10,10,10,10,10,10,10]
                          })

df['DATE_IN'] = pd.to_datetime(df.DATE_IN)
df['DATE_OUT'] = pd.to_datetime(df.DATE_OUT)

target=pd.DataFrame({'PERIOD':pd.date_range(df.DATE_IN.min(), df.DATE_OUT.max(), freq='M'),
             'n':int(0)})

我下面的嘗試是一個 for 循環。 在循環中,我創建了一個 dataframe 一列,一個日期范圍。 然后我使用那個月在相應的月份訪問 df_target 並添加 1。這有效。 但在這種情況下,性能對我來說很重要。 我想在具有 8-9 百萬行的數據集上執行此操作或此操作的改進版本。 那么也許 for 循環會很慢?

關於如何改進此解決方案的任何想法?


for z in range(0, len(df)):
    
    tmp=pd.DataFrame({'PERIOD':pd.date_range(df.DATE_IN[z], df.DATE_OUT[z], freq='M')})
    
    for i in range(0, len(tmp)):
        
        info=target[target['PERIOD']==tmp.PERIOD[i]].n + 1
        target.loc[info.index[0], 'n'] = (target.loc[info.index[0], 'n'] + 1)

您可以使用pd.date_range擴展DATE_INDATE_OUT列之間的日期,然后展開它。 最后,對每個月使用計數唯一值。

target = (
    df.apply(lambda x: pd.date_range(x['DATE_IN'], x['DATE_OUT'], freq='M'), axis=1)
      .explode().value_counts().sort_index().rename('n').rename_axis('PERIOD').reset_index()
)
print(target)

# Output
       PERIOD  n
0  2013-01-31  1
1  2013-02-28  1
2  2013-03-31  1
3  2013-04-30  1
4  2013-05-31  1
5  2013-06-30  1
...
52 2017-05-31  1
53 2017-06-30  1
54 2017-07-31  1
55 2017-08-31  1
56 2017-09-30  1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM