熊猫将日期时间列移回一小时



我在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  

而且,我对如何实现这一目标或如何研究它没有真正的想法。谢谢

最好创建一个适当的日期时间对象,然后简单地删除小时作为总和,这将处理以天为单位的任何编辑。然后,我们可以使用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

使用,DataFrame.shift将列移01,然后在df2的列0上使用Series.bfill来填充缺失值,然后在 df2 的第 1 列上使用.fillna来填充NaN值,最后使用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

你可以在熊猫中做减法(考虑到数据帧中的数据不是字符串类型(

我将向您展示如何做到这一点的示例

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

最新更新