Pandas 将日期时间列后移一小时

Pandas Shift Date Time Columns Back One Hour

我在 DF (df1) 中的数据如下所示开始和结束,我正在尝试移动下面的“0”和“1”列,以便将日期和时间后移一小时日期和时间从小时 == 0 开始,而不是小时 == 1。

数据开始 (df1) -

          0    1         2         3         4    5         6       7  
0  20160101  100  7.977169  109404.0  20160101  100  4.028678   814.0   
1  20160101  200  8.420204  128546.0  20160101  200  4.673662  2152.0   
2  20160101  300  9.515370  165931.0  20160101  300  8.019863  8100.0   

数据结束 (df1) -

             0     1         2        3         4     5         6      7  
8780  20161231  2100  4.198906  11371.0  20161231  2100  0.995571  131.0   
8781  20161231  2200  4.787433  19083.0  20161231  2200  1.029809    NaN   
8782  20161231  2300  3.987506   9354.0  20161231  2300  0.900942    NaN   
8783  20170101     0  3.284947   1815.0  20170101     0  0.899262    NaN   

我需要将开始的日期和时间向后移一小时,所以开始时间是小时开始而不是小时结束 -

          0    1         2         3         4    5         6       7  
0  20160101  000  7.977169  109404.0  20160101  100  4.028678   814.0   
1  20160101  100  8.420204  128546.0  20160101  200  4.673662  2152.0   
2  20160101  200  9.515370  165931.0  20160101  300  8.019863  8100.0    

并以下面的日期和时间结束 -

             0     1         2        3         4     5         6      7  
8780  20161231  2000  4.198906  11371.0  20161231  2100  0.995571  131.0   
8781  20161231  2100  4.787433  19083.0  20161231  2200  1.029809    NaN   
8782  20161231  2200  3.987506   9354.0  20161231  2300  0.900942    NaN   
8783  20161231  2300  3.284947   1815.0  20170101     0  0.899262    NaN  

而且,我不知道如何完成或如何研究它。谢谢,

使用 DataFrame.shift to shift the columns 0, 1, then use Series.bfill on column 0 of df2 to fill the missing values, then use .fillna on column 1 of df2 to fill the NaN values, finally use Dataframe.join 将数据帧 df2 与数据帧 df1:

连接起来
df2 = df1[['0', '1']].shift()
df2['0'] = df2['0'].bfill()
df2['1'] = df2['1'].fillna('000')
df2 = df2.join(df1.loc[:, '2':])

# print(df2)
             0     1         2         3         4     5         6       7
0     20160101   000  7.977169  109404.0  20160101   100  4.028678   814.0
1     20160101   100  8.420204  128546.0  20160101   200  4.673662  2152.0
2     20160101   200  9.515370  165931.0  20160101   300  8.019863  8100.0
...
8780  20160101   300  4.198906   11371.0  20161231  2100  0.995571   131.0
8781  20161231  2100  4.787433   19083.0  20161231  2200  1.029809     NaN
8782  20161231  2200  3.987506    9354.0  20161231  2300  0.900942     NaN
8783  20161231  2300  3.284947    1815.0  20170101     0  0.899262     NaN

你可以在pandas中做减法(考虑到你的dataframe中的数据不是字符串类型)

我将向您展示如何完成的示例

import pandas as pd 

df = pd.DataFrame()

df['time'] = [0,100,500,2100,2300,0]    #creating dataframe 

df['time'] = df['time']-100             #This is what you want to do

现在您的数据将减去 100。

有一种情况减去 0 你会得到 -100 作为时间。为此,您可以这样做:

for i in range(len(df['time'])):
    if df['time'].iloc[i]== -100:
        df['time'].iloc[i]=2300

最好创建一个合适的日期时间对象,然后简单地将小时数作为总和删除,这将处理以天为单位的任何修订。然后我们可以使用 dt.strftime 重新创建您的对象(字符串)列。

s = pd.to_datetime(
    df[0].astype(str) + df[1].astype(str).str.zfill(4), format="%Y%m%d%H%M"
)

0      2016-01-01 01:00:00
1      2016-01-01 02:00:00
2      2016-01-01 03:00:00
8780   2016-12-31 21:00:00
8781   2016-12-31 22:00:00
8782   2016-12-31 23:00:00
8783   2017-01-01 00:00:00
dtype: datetime64[ns]

df[1] = (s - pd.DateOffset(hours=1)).dt.strftime("%H%M").str.lstrip("0").str.zfill(3)
df[0] = (s - pd.DateOffset(hours=1)).dt.strftime("%Y%d%m")

print(df)

             0     1         2         3         4     5         6       7
0     20160101   000  7.977169  109404.0  20160101   100  4.028678   814.0
1     20160101   100  8.420204  128546.0  20160101   200  4.673662  2152.0
2     20160101   200  9.515370  165931.0  20160101   300  8.019863  8100.0
8780  20163112  2000  4.198906   11371.0  20161231  2100  0.995571   131.0
8781  20163112  2100  4.787433   19083.0  20161231  2200  1.029809     NaN
8782  20163112  2200  3.987506    9354.0  20161231  2300  0.900942     NaN
8783  20163112  2300  3.284947    1815.0  20170101     0  0.899262     NaN