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

标签 pandas date shift

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

关于Pandas 将日期时间列向后移动一小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62472689/

相关文章:

c++ - 如何在 C++ 中将数组右移?

c - Windows API : Get micro seconds between milli seconds

json - 如何从JSON返回Date值到Google Visualization API

python - 将for循环转换为递归[查找连续的工作日]

c - 移入一位(此位应为“1”)

javascript - Google Chrome console.log 乱序?

python - 读取多个 csv 文件并将文件名添加为 Pandas 中的新列

Python:制作包含两列项目的字典

python-3.x - 如何从 Pandas DataFrame 绘制家谱?

python - 如何使用既是数组又是普通 int 的列来拆解 pandas 的堆栈?