【问题标题】:Grouping by the days data into each weeks possibly using datetime. dataframe is different for each day. Have to merge可能使用日期时间按天数据分组到每周。数据框每天都不同。必须合并
【发布时间】:2020-08-13 15:13:00
【问题描述】:

import pandas as pd

# intialise data of lists. 
date1={'Indv':[1,2,3,4],'date':[1,1,1,1],'number':[5,5,5,5]}
date2={'Indv':[1,2,3,4],'date':[2,2,2,2],'number':[5,6,5,3]}
date3={'Indv':[1,2,3,4],'date':[3,3,3,3],'number':[2,3,4,5]}
date4={'Indv':[1,2,3,4],'date':[4,4,4,4],'number':[1,3,4,5]}
date5={'Indv':[1,2,3,4],'date':[5,5,5,5],'number':[2,3,7,5]}
date6={'Indv':[1,2,3,4],'date':[6,6,6,6],'number':[9,11,4,5]}
date7={'Indv':[1,2,3,4],'date':[7,7,7,7],'number':[3,3,4,5]}

date8={'Indv':[1,2,3,4],'date':[8,8,8,8],'number':[5,5,5,5]}
date9={'Indv':[1,2,3,4],'date':[9,9,9,9],'number':[5,6,5,3]}
date10={'Indv':[1,2,3,4],'date':[10,10,10,10],'number':[2,3,4,5]}
date11={'Indv':[1,2,3,4],'date':[11,11,11,11],'number':[1,3,4,5]}
date12={'Indv':[1,2,3,4],'date':[12,12,12,12],'number':[2,3,7,5]}
date13={'Indv':[1,2,3,4],'date':[13,13,13,13],'number':[9,11,4,5]}
date14={'Indv':[1,2,3,4],'date':[14,14,14,14],'number':[3,3,4,5]}



#CreateDataFrame
#Importing first seven days data
df1=pd.DataFrame(date1)
df2=pd.DataFrame(date2)
df3=pd.DataFrame(date3)
df4=pd.DataFrame(date4)
df5=pd.DataFrame(date5)
df6=pd.DataFrame(date6)
df7=pd.DataFrame(date7)

#merging first seven days data into one week data
final_week_1=df1.append([df2,df3,df4,df5,df6,df7])
final_week_1['week']=1

#Performing a groupby on week 1
groupby_week_1=final_week_1.groupby(['Indv','week'])['number'].sum().reset_index(name='weekly_total')

#delete the intermediate  files to freeup memory and keep only the
del final_week_1


#CreateDataFrame
#Importing next set of seven days data of week 2
df8=pd.DataFrame(date8)
df9=pd.DataFrame(date9)
df10=pd.DataFrame(date10)
df11=pd.DataFrame(date11)
df12=pd.DataFrame(date12)
df13=pd.DataFrame(date13)
df14=pd.DataFrame(date14)

#merging second set of seven days and week 2
final_week_2=df8.append([df9,df10,df11,df12,df13,df14])
final_week_2['week']=2

#Performing a groupby on week 2
groupby_week_2=final_week_2.groupby(['Indv','week'])['number'].sum().reset_index(name='weekly_total')
del final_week_2

all_weeks_data=groupby_week_1.append([groupby_week_1])


需要循环上面的代码,得到最终的上面的all_weeks_data的每周分组数据

数据采用每日格式

需要从 52 周的第 1 天到第 n 天每 7 天合并一次。每周处理文件并导出数据。合并所有 n 天的数据会引发内存错误,因为文件大小非常大。

需要编写python代码来合并每7天的数据,导出并继续那几周的循环

【问题讨论】:

  • 很抱歉,我真的无法理解你想要什么,你真正的输入是什么,你的预期输出是什么。
  • 更新了我的问题。需要将 7 天的文件合并为周文件,对其进行处理并在下周继续工作。每周处理 7 天的文件必须保持循环。
  • 数据是否以字典的形式呈现?另外date的数据类型是什么?
  • 数据为 csv 格式。刚刚使用字典创建了虚拟数据集。每个df代表一天的数据。

标签: python pandas datetime group-by python-datetime


【解决方案1】:

据我了解,您需要对给定“数字”进行每周总结。如果不是这种情况,请更新问题:

import pandas as pd
from datetime import datetime

date1={'Indv':[1,2,3,4],'date':['2020-02-01','2020-02-01','2020-02-01','2020-02-01'],'number':[5,5,5,5]}
date2={'Indv':[1,2,3,4],'date':['2020-02-02','2020-02-02','2020-02-02','2020-02-02'],'number':[5,6,5,3]}
date3={'Indv':[1,2,3,4],'date':['2020-02-03','2020-02-03','2020-02-03','2020-02-03'],'number':[2,3,4,5]}
date4={'Indv':[1,2,3,4],'date':['2020-02-04','2020-02-04','2020-02-04','2020-02-04'],'number':[1,3,4,5]}
date5={'Indv':[1,2,3,4],'date':['2020-02-05','2020-02-05','2020-02-05','2020-02-05'],'number':[2,3,7,5]}
date6={'Indv':[1,2,3,4],'date':['2020-02-06','2020-02-06','2020-02-06','2020-02-06'],'number':[9,11,4,5]}
date7={'Indv':[1,2,3,4],'date':['2020-02-07','2020-02-07','2020-02-07','2020-02-07'],'number':[3,3,4,5]}
date8={'Indv':[1,2,3,4],'date':['2020-02-08','2020-02-08','2020-02-08','2020-02-08'],'number':[5,5,5,5]}
date9={'Indv':[1,2,3,4],'date':['2020-02-09','2020-02-09','2020-02-09','2020-02-09'],'number':[5,6,5,3]}
date10={'Indv':[1,2,3,4],'date':['2020-02-10','2020-02-10','2020-02-10','2020-02-10'],'number':[2,3,4,5]}
date11={'Indv':[1,2,3,4],'date':['2020-02-11','2020-02-11','2020-02-11','2020-02-11'],'number':[1,3,4,5]}
date12={'Indv':[1,2,3,4],'date':['2020-02-12','2020-02-12','2020-02-12','2020-02-12'],'number':[2,3,7,5]}
date13={'Indv':[1,2,3,4],'date':['2020-02-13','2020-02-13','2020-02-13','2020-02-13'],'number':[9,11,4,5]}
date14={'Indv':[1,2,3,4],'date':['2020-02-14','2020-02-14','2020-02-14','2020-02-14'],'number':[3,3,4,5]}

#CreateDataFrame
df1=pd.DataFrame(date1)
df2=pd.DataFrame(date2)
df3=pd.DataFrame(date3)
df4=pd.DataFrame(date4)
df5=pd.DataFrame(date5)
df6=pd.DataFrame(date6)
df7=pd.DataFrame(date7)
df8=pd.DataFrame(date8)
df9=pd.DataFrame(date9)
df10=pd.DataFrame(date10)
df11=pd.DataFrame(date11)
df12=pd.DataFrame(date12)
df13=pd.DataFrame(date13)
df14=pd.DataFrame(date14)

df_list = [df1,df2,df3,df4,df5,df6,df7,df8,df9,df10,df11,df12,df13,df14]

def append_df(df_list):
    df = pd.DataFrame()
    df = df.append(df_list)
    df['date'] = df['date'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d'))
    df['week'] = df['date'].dt.week
    return df

all_dates_data = append_df(df_list)
weekly_total = all_dates_data.groupby(['week']).sum()

我冒昧地假设了date 列的数据类型。 接下来,我编写了一个函数,可以将日期转换为“周数”;最后按“周”分组。

【讨论】:

  • 你说得对。但是,每天的文件超过 50MB,超过 100 万行和四列。因此,我无法附加全年数据并按组放置。这给了我一个内存错误。也就是说,我正在尝试的流程是,只需导入 7 天的文件,对其进行分组处理并导出。接下来转到第二周的接下来的 7 天,然后执行相同的操作。在这个过程中,我只是逐周单独处理,而不是合并全年数据集。即使您的解决方案对我有用。但这最终会导致内存错误。这就是为什么我试图保持相同的循环。
  • 感谢您的时间和精力。
  • 我写了一段代码。我想让它保持 7 天的循环,而不是合并所有文件。 MERGED_FILE=pd.DataFrame a = pd.date_range(start='20190103', end='20190109') for i in a: i = str(i) j = i.replace('-', '') j = j.replace(' 00:00:00', '') df = pd.read_csv(r'\\\\path\\' + j + '_file.csv') MERGED_FILE=MERGED_FILE.append(df) df2=MERGED_FILE.groupby(['Indv','week'])['number'].sum().reset_index(name='Total') print(len(MERGED_FILE)) df2.to_csv(r'path_export')
  • 别担心!感谢您进一步解释这一点。我想知道是否最好为每个文件设置groupby 日期。也就是说,与其处理一周的数据,不如每天处理一次然后追加?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多