python使用不同的时间戳和相同的列名连接不同的日期数据帧

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

我有来自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

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个数据帧都堆叠在一个列表中。如果你有大数据,那么将多个数据集存储到内存中不是一个好主意。最好一个接一个地加载和合并。顺便说一句,好的。