Pandas Сдвинуть столбцы даты и времени назад на один час - PullRequest
2 голосов
/ 19 июня 2020

У меня есть данные в 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  

И я понятия не имею, как достичь sh этого или как это исследовать. Спасибо,

Ответы [ 3 ]

1 голос
/ 19 июня 2020

IIU C, было бы лучше создать правильный объект datetime, а затем просто удалить часы как сумму, которая будет обрабатывать любое редактирование в днях. Затем мы можем использовать 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
1 голос
/ 19 июня 2020

Используйте, DataFrame.shift, чтобы сместить столбцы 0, 1, затем используйте Series.bfill в столбце 0 из df2, чтобы заполнить отсутствующие значения, затем используйте .fillna в столбце 1 df2, чтобы заполнить значения 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
0 голосов
/ 19 июня 2020

Вы можете выполнять вычитание в pandas (учитывая, что данные в вашем фрейме данных не являются строковыми)

Я покажу вам пример того, как это можно сделать

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...