python使用不同的时间戳和相同的列名连接不同的日期数据帧
我有来自26个不同发电厂的数据和现场的阳光传感器数据。每个传感器为一天创建一个数据帧。我有14天的数据。所以,我实际上有26x14=364个单独的数据帧。最后,我想把它们结合在一起。下面我给出了一个示例数据:python使用不同的时间戳和相同的列名连接不同的日期数据帧,python,dataframe,Python,Dataframe,我有来自26个不同发电厂的数据和现场的阳光传感器数据。每个传感器为一天创建一个数据帧。我有14天的数据。所以,我实际上有26x14=364个单独的数据帧。最后,我想把它们结合在一起。下面我给出了一个示例数据: ## Data coming in form of dataframes from field sensors sundf ptA_d1df ### PlantA_Day1Dataframe ptB_d1df ptA_d2df ptB_d2df ptA_d3df ptB_d3df df
## Data coming in form of dataframes from field sensors
sundf
ptA_d1df ### PlantA_Day1Dataframe
ptB_d1df
ptA_d2df
ptB_d2df
ptA_d3df
ptB_d3df
dflist = [ptA_d1df, ptB_d1df,ptA_d2df,ptB_d2df,ptA_d3df,ptB_d3df]
给定日期的数据帧具有不同的时间戳,如下所示
sundf =
light
2019-01-10 07:35:00 500
2019-01-10 07:36:00 510
2019-01-10 07:37:00 520
2019-01-10 07:38:00 530
2019-01-10 07:39:00 540
2019-01-10 08:14:00 550
2019-01-10 08:15:00 560
2019-01-10 08:16:00 570
2019-01-10 08:17:00 580
2019-01-10 08:18:00 590
2019-01-21 07:34:00 600
2019-01-21 07:35:00 610
2019-01-21 07:36:00 620
2019-01-21 07:38:00 630
2019-01-21 07:39:00 640
2019-01-21 07:40:00 650
2019-01-21 08:14:00 660
2019-01-21 08:15:00 670
2019-01-21 08:16:00 680
2019-01-21 08:18:00 690
2019-01-21 08:19:00 700
2019-01-21 08:20:00 710
ptA_d1df =
A
2019-01-10 07:35:22 10
2019-01-10 08:15:17 20
ptB_d1df =
B
2019-01-10 07:38:45 30
2019-01-10 08:18:57 40
ptA_d2df =
A
2019-01-21 07:35:42 50
2019-01-21 08:15:17 60
ptB_d2df =
B
2019-01-21 07:39:04 70
2019-01-21 08:19:22 80
我想将上述内容组合成一个数据帧,以便将每个会话数据分组在一起。这意味着,上午7点35分左右的两个电厂的数据应分组为一个时间戳,而不是两个时间戳,并且,具有相同名称的列应分组为相同的列,而不是创建新列
我的代码如下:
dflist = [ptA_d1df, ptB_d1df,ptA_d2df,ptB_d2df]
l=[]
k1 = []
sundf.index = pd.to_datetime(sundf.index)
sundf['time']=sundf.index
for i,x in enumerate(dflist):
k1=sundf.reindex(dflist[i].index,method='nearest') `
l.append(k1.join(dflist[i]).set_index('time').reindex(k1.index,method='nearest'))
combdf = pd.concat(l,1)
datetime light A B light A B light A B light A B
2019-01-10 07:35:22 500 10 NaN ........................ ..
2019-01-10 07:38:45 NaN ......... 530 . 30 Nan....................
2019-01-10 08:15:17 560 20 Nan........................
2019-01-10 08:18:57 NaN ......... 590 . 40 Nan........................
2019-01-21 07:35:42 NaN . 610 50
2019-01-21 07:39:04 640 70
2019-01-21 08:15:17
2019-01-21 08:19:22
combdf =
datetime light A light B
2019-01-10 07:35:22 500 10 530 30
2019-01-10 08:15:17 560 20 590 40
2019-01-21 07:35:42 610 50 640 70
2019-01-21 08:15:17 670 60 700 80
我得到了不同时间戳和不同列的输出,如下所示:
dflist = [ptA_d1df, ptB_d1df,ptA_d2df,ptB_d2df]
l=[]
k1 = []
sundf.index = pd.to_datetime(sundf.index)
sundf['time']=sundf.index
for i,x in enumerate(dflist):
k1=sundf.reindex(dflist[i].index,method='nearest') `
l.append(k1.join(dflist[i]).set_index('time').reindex(k1.index,method='nearest'))
combdf = pd.concat(l,1)
datetime light A B light A B light A B light A B
2019-01-10 07:35:22 500 10 NaN ........................ ..
2019-01-10 07:38:45 NaN ......... 530 . 30 Nan....................
2019-01-10 08:15:17 560 20 Nan........................
2019-01-10 08:18:57 NaN ......... 590 . 40 Nan........................
2019-01-21 07:35:42 NaN . 610 50
2019-01-21 07:39:04 640 70
2019-01-21 08:15:17
2019-01-21 08:19:22
combdf =
datetime light A light B
2019-01-10 07:35:22 500 10 530 30
2019-01-10 08:15:17 560 20 590 40
2019-01-21 07:35:42 610 50 640 70
2019-01-21 08:15:17 670 60 700 80
我想要一个如下所示的输出:
dflist = [ptA_d1df, ptB_d1df,ptA_d2df,ptB_d2df]
l=[]
k1 = []
sundf.index = pd.to_datetime(sundf.index)
sundf['time']=sundf.index
for i,x in enumerate(dflist):
k1=sundf.reindex(dflist[i].index,method='nearest') `
l.append(k1.join(dflist[i]).set_index('time').reindex(k1.index,method='nearest'))
combdf = pd.concat(l,1)
datetime light A B light A B light A B light A B
2019-01-10 07:35:22 500 10 NaN ........................ ..
2019-01-10 07:38:45 NaN ......... 530 . 30 Nan....................
2019-01-10 08:15:17 560 20 Nan........................
2019-01-10 08:18:57 NaN ......... 590 . 40 Nan........................
2019-01-21 07:35:42 NaN . 610 50
2019-01-21 07:39:04 640 70
2019-01-21 08:15:17
2019-01-21 08:19:22
combdf =
datetime light A light B
2019-01-10 07:35:22 500 10 530 30
2019-01-10 08:15:17 560 20 590 40
2019-01-21 07:35:42 610 50 640 70
2019-01-21 08:15:17 670 60 700 80
这里有一个解决方案,通过修改datetime列:
# convert all to datetime
dflist = [ptA_d1df, ptB_d1df,ptA_d2df,ptB_d2df]
# convert all to datetime
for df_use in dflist + [sundf]:
df_use['date'] = pd.to_datetime(df_use['date'])
# discard seconds, overwrite if not important
# if granularity is important: create a new column
df_use['date'] = df_use['date'].dt.strftime('%Y-%m-%d %H:%M')
# set index for concatenating
for df_use in dflist:
df_use.set_index('date', inplace=True)
# concat them
df_mix = pd.concat(dflist, sort=False)
df_mix.reset_index(drop=False,inplace=True)
# merge them with the main df
df_agg = sundf.merge(df_mix)
# ---------------------------
# Now that the df is aggregated, get values for each observation
#
# create a new column of modified dates (for grouping)
df_agg['date'] = pd.to_datetime(df_agg['date'])
df_agg['date'] = df_agg['date'].dt.strftime('%Y-%m-%d %H')
# Create new lookup dfs
df_agg_A = df_agg[['date','Light','Light_A']].dropna()
df_agg_A.rename(columns={'Light':'Light_at_A'},inplace=True)
df_agg_B = df_agg[['date','Light','Light_B']].dropna()
df_agg_B.rename(columns={'Light':'Light_at_B'},inplace=True)
df_final = pd.merge(df_agg_A, df_agg_B)
# - - - - - - - - - - - - - -
date Light_at_A Light_A Light_at_B Light_B
0 2019-01-10 07 500 10.0 530 30.0
1 2019-01-10 08 560 20.0 590 40.0
2 2019-01-21 07 610 50.0 640 70.0
3 2019-01-21 08 670 60.0 700 80.0
这里有一个解决方案,通过修改datetime列:
# convert all to datetime
dflist = [ptA_d1df, ptB_d1df,ptA_d2df,ptB_d2df]
# convert all to datetime
for df_use in dflist + [sundf]:
df_use['date'] = pd.to_datetime(df_use['date'])
# discard seconds, overwrite if not important
# if granularity is important: create a new column
df_use['date'] = df_use['date'].dt.strftime('%Y-%m-%d %H:%M')
# set index for concatenating
for df_use in dflist:
df_use.set_index('date', inplace=True)
# concat them
df_mix = pd.concat(dflist, sort=False)
df_mix.reset_index(drop=False,inplace=True)
# merge them with the main df
df_agg = sundf.merge(df_mix)
# ---------------------------
# Now that the df is aggregated, get values for each observation
#
# create a new column of modified dates (for grouping)
df_agg['date'] = pd.to_datetime(df_agg['date'])
df_agg['date'] = df_agg['date'].dt.strftime('%Y-%m-%d %H')
# Create new lookup dfs
df_agg_A = df_agg[['date','Light','Light_A']].dropna()
df_agg_A.rename(columns={'Light':'Light_at_A'},inplace=True)
df_agg_B = df_agg[['date','Light','Light_B']].dropna()
df_agg_B.rename(columns={'Light':'Light_at_B'},inplace=True)
df_final = pd.merge(df_agg_A, df_agg_B)
# - - - - - - - - - - - - - -
date Light_at_A Light_A Light_at_B Light_B
0 2019-01-10 07 500 10.0 530 30.0
1 2019-01-10 08 560 20.0 590 40.0
2 2019-01-21 07 610 50.0 640 70.0
3 2019-01-21 08 670 60.0 700 80.0
一种解决方案是将时间划分为5分钟的时间范围:
import pandas as pd
sun = [['2019-01-10 07:35:00', 500], ['2019-01-10 08:15:00', 560],
['2019-01-21 07:35:00', 610], ['2019-01-21 08:15:00', 670]]
A = [['2019-01-10 07:36:22', 10], ['2019-01-10 08:15:17', 20],
['2019-01-21 07:35:42', 50], ['2019-01-21 08:15:17', 60]]
B = [['2019-01-10 07:35:27', 30], ['2019-01-10 08:15:17', 40],
['2019-01-21 07:35:22', 70], ['2019-01-21 08:17:37', 80]]
dfsun = pd.DataFrame(sun, columns=['date', 'light'])
dfa = pd.DataFrame(A, columns=['date', 'A'])
dfb = pd.DataFrame(B, columns=['date', 'B'])
dfa['date'] = pd.to_datetime(dfa['date']).dt.floor('5T')
dfb['date'] = pd.to_datetime(dfb['date']).dt.floor('5T')
dfsun['date'] = pd.to_datetime(dfsun['date'])
df = pd.merge(dfa, dfb, on='date', how="outer")
df = pd.merge(dfsun, df, on='date', how="right")
print(df)
出[]:
date light A B
0 2019-01-10 07:35:00 500 10 30
1 2019-01-10 08:15:00 560 20 40
2 2019-01-21 07:35:00 610 50 70
3 2019-01-21 08:15:00 670 60 80
如果您已经在csv文件中拥有格式为'file{day}{sensor}.csv'
的数据,例如:file_1_2.csv
df = pd.DataFrame([],columns=['date'])
for day in range(1,15): # csvs :'file_{day}_{sensor}.csv'e.g:'file_1_2.csv'
dfSensor=pd.DataFrame([],columns=['date'])
for sensor in range(1,27):
dfNew = pd.read_csv(f'file_{day}_{sensor}.csv', names=['date',
sensor])
dfNew['date'] = pd.to_datetime(dfNew['date']).dt.floor('5T')
dfSensor = pd.concat([dfSensor,dfNew])
df = pd.merge(df, dfSensor, on='date', how="outer")
df = pd.merge(dfsun, df, on='date', how="right")
一种解决方案是将时间划分为5分钟的时间范围:
import pandas as pd
sun = [['2019-01-10 07:35:00', 500], ['2019-01-10 08:15:00', 560],
['2019-01-21 07:35:00', 610], ['2019-01-21 08:15:00', 670]]
A = [['2019-01-10 07:36:22', 10], ['2019-01-10 08:15:17', 20],
['2019-01-21 07:35:42', 50], ['2019-01-21 08:15:17', 60]]
B = [['2019-01-10 07:35:27', 30], ['2019-01-10 08:15:17', 40],
['2019-01-21 07:35:22', 70], ['2019-01-21 08:17:37', 80]]
dfsun = pd.DataFrame(sun, columns=['date', 'light'])
dfa = pd.DataFrame(A, columns=['date', 'A'])
dfb = pd.DataFrame(B, columns=['date', 'B'])
dfa['date'] = pd.to_datetime(dfa['date']).dt.floor('5T')
dfb['date'] = pd.to_datetime(dfb['date']).dt.floor('5T')
dfsun['date'] = pd.to_datetime(dfsun['date'])
df = pd.merge(dfa, dfb, on='date', how="outer")
df = pd.merge(dfsun, df, on='date', how="right")
print(df)
出[]:
date light A B
0 2019-01-10 07:35:00 500 10 30
1 2019-01-10 08:15:00 560 20 40
2 2019-01-21 07:35:00 610 50 70
3 2019-01-21 08:15:00 670 60 80
如果您已经在csv文件中拥有格式为'file{day}{sensor}.csv'
的数据,例如:file_1_2.csv
df = pd.DataFrame([],columns=['date'])
for day in range(1,15): # csvs :'file_{day}_{sensor}.csv'e.g:'file_1_2.csv'
dfSensor=pd.DataFrame([],columns=['date'])
for sensor in range(1,27):
dfNew = pd.read_csv(f'file_{day}_{sensor}.csv', names=['date',
sensor])
dfNew['date'] = pd.to_datetime(dfNew['date']).dt.floor('5T')
dfSensor = pd.concat([dfSensor,dfNew])
df = pd.merge(df, dfSensor, on='date', how="outer")
df = pd.merge(dfsun, df, on='date', how="right")
谢谢你花时间回答这个问题。我每天有26个数据帧,持续14天。因此,26x14=364个数据帧。所以,您可以修改上面的代码来组合364个数据帧数据。在上面的代码中,例如:创建新的查找dfs。如果将所有数据帧添加到列表
dflist
,则该代码应该可以工作。试试看会发生什么?您创建了一个名为df\u agg\u A
的东西。如何在我的案例中使用它,因为我有364个数据帧?df_agg
是聚合值+每秒的日期时间,与工厂A和B的值相结合。您可以通过连接将“灯光
”的值添加到sundf
。您可以将A和B中的值添加到列表dflist
。您可以修改代码以计算26个光伏电站吗。在您的代码中,仅存在Plant-A和Plant-B。我有26个光伏电站的数据。我没有弄清楚如何对26个光伏电站数据执行它。感谢您花时间回答这个问题。我每天有26个数据帧,持续14天。因此,26x14=364个数据帧。所以,您可以修改上面的代码来组合364个数据帧数据。在上面的代码中,例如:创建新的查找dfs。如果将所有数据帧添加到列表dflist
,则该代码应该可以工作。试试看会发生什么?您创建了一个名为df\u agg\u A
的东西。如何在我的案例中使用它,因为我有364个数据帧?df_agg
是聚合值+每秒的日期时间,与工厂A和B的值相结合。您可以通过连接将“灯光
”的值添加到sundf
。您可以将A和B中的值添加到列表dflist
。您可以修改代码以计算26个光伏电站吗。在您的代码中,仅存在Plant-A和Plant-B。我有26个光伏电站的数据。我没有弄清楚如何对26个光伏电站数据执行它。感谢您花时间回答这个问题。我每天有26个数据帧,持续14天。因此,26x14=364个数据帧。每天大约有18个时间戳。所以,您可以修改上面的代码来组合364个数据帧数据。当然,您是如何存储这些数据帧的?(csv或列表中的内存中)364个csv文件。现在,364个数据帧在我上面的问题.364csv文件中作为dflist保存在一个列表中。现在364个数据帧都堆叠在一个列表中。如果你有大数据,那么将多个数据集存储到内存中不是一个好主意。最好一个接一个地加载和合并。顺便说一句,好的。谢谢你花时间回答这个问题。我每天有26个数据帧,持续14天。因此,26x14=364个数据帧。每天大约有18个时间戳。所以,您可以修改上面的代码来组合364个数据帧数据。当然,您是如何存储这些数据帧的?(csv或列表中的内存中)364个csv文件。现在,364个数据帧在我上面的问题.364csv文件中作为dflist保存在一个列表中。现在364个数据帧都堆叠在一个列表中。如果你有大数据,那么将多个数据集存储到内存中不是一个好主意。最好一个接一个地加载和合并。顺便说一句,好的。