Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:有没有办法1)在数据帧中的每一行上方添加两个新的空行,2)用相同的值填充行?_Python_Pandas_Datetime - Fatal编程技术网

Python 熊猫:有没有办法1)在数据帧中的每一行上方添加两个新的空行,2)用相同的值填充行?

Python 熊猫:有没有办法1)在数据帧中的每一行上方添加两个新的空行,2)用相同的值填充行?,python,pandas,datetime,Python,Pandas,Datetime,我有一个简单的数据框(来自热带降雨测量任务的数据,TRMM,如果有助于提供上下文),一列用于日期时间,一列用于降水测量,如下所示: ppt date 1998-01-01 03:00:00 0.00 1998-01-01 06:00:00 0.00 1998-01-01 09:00:00 0.03 1998-01-01 12:00:00 0.20

我有一个简单的数据框(来自热带降雨测量任务的数据,TRMM,如果有助于提供上下文),一列用于日期时间,一列用于降水测量,如下所示:

                        ppt
date            

1998-01-01 03:00:00     0.00    
1998-01-01 06:00:00     0.00    
1998-01-01 09:00:00     0.03    
1998-01-01 12:00:00     0.20
                        ppt
date            
1998-01-01 01:00:00     0.00
1998-01-01 02:00:00     0.00    
1998-01-01 03:00:00     0.00
1998-01-01 04:00:00     0.00
1998-01-01 05:00:00     0.00    
1998-01-01 06:00:00     0.00
1998-01-01 07:00:00     0.03
1998-01-01 08:00:00     0.03    
1998-01-01 09:00:00     0.03
1998-01-01 10:00:00     0.20
1998-01-01 11:00:00     0.20    
1998-01-01 12:00:00     0.20    
读数为每三小时一次,数值为前三小时每小时降雨量的3小时平均值。我想创建一个数据框,其中包含每小时的降雨量测量值,因此看起来如下所示:

                        ppt
date            

1998-01-01 03:00:00     0.00    
1998-01-01 06:00:00     0.00    
1998-01-01 09:00:00     0.03    
1998-01-01 12:00:00     0.20
                        ppt
date            
1998-01-01 01:00:00     0.00
1998-01-01 02:00:00     0.00    
1998-01-01 03:00:00     0.00
1998-01-01 04:00:00     0.00
1998-01-01 05:00:00     0.00    
1998-01-01 06:00:00     0.00
1998-01-01 07:00:00     0.03
1998-01-01 08:00:00     0.03    
1998-01-01 09:00:00     0.03
1998-01-01 10:00:00     0.20
1998-01-01 11:00:00     0.20    
1998-01-01 12:00:00     0.20    
你知道我该怎么做吗?

IIUC 为了获得上述各项:

# repeated decreasing number of hours
# [2 hr, 1 hr, 0 hr, 2 hr, 1 hr, 0 hr, ...]
d = np.tile(np.arange(3)[::-1], len(df)) * pd.Timedelta(1, unit='H')

# repeat the index 3 times for every entry
# [3:00, 3:00, 3:00, 6:00, 6:00, 6:00, ...]
i = df.index.repeat(3)
df_ = df.loc[i]

# take care of differences
# [3:00, 3:00, 3:00, 6:00, 6:00, 6:00, ...]
#  minus
# [2 hr, 1 hr, 0 hr, 2 hr, 1 hr, 0 hr, ...]
# [1:00, 2:00, 3:00, 4:00, 5:00, 6:00, ...]
df_.index -= d

df_

                      ppt
date                     
1998-01-01 01:00:00  0.00
1998-01-01 02:00:00  0.00
1998-01-01 03:00:00  0.00
1998-01-01 04:00:00  0.00
1998-01-01 05:00:00  0.00
1998-01-01 06:00:00  0.00
1998-01-01 07:00:00  0.03
1998-01-01 08:00:00  0.03
1998-01-01 09:00:00  0.03
1998-01-01 10:00:00  0.20
1998-01-01 11:00:00  0.20
1998-01-01 12:00:00  0.20

asfreq
resample
只会带你走这么远

df.asfreq('H').bfill()

                      ppt
date                     
1998-01-01 03:00:00  0.00
1998-01-01 04:00:00  0.00
1998-01-01 05:00:00  0.00
1998-01-01 06:00:00  0.00
1998-01-01 07:00:00  0.03
1998-01-01 08:00:00  0.03
1998-01-01 09:00:00  0.03
1998-01-01 10:00:00  0.20
1998-01-01 11:00:00  0.20
1998-01-01 12:00:00  0.20
我们错过了比赛

1998-01-01 01:00:00  0.00
1998-01-01 02:00:00  0.00

在开头

如果正确指定了开始时间,则可以使用带回填的重采样:

import pandas as pd
import numpy as np


#specify start and end times so that the range to fill is clear
start = pd.Timestamp('1998-01-01 00:00:00')
end = pd.Timestamp('1998-01-01 12:00:00')
t = np.linspace(start.value, end.value, 5)
t = pd.to_datetime(t)
df=pd.DataFrame(index=t)

#populate existing values
df['ppt']=[0.,0.,0.,0.03,0.2]

#resample and fill backwards
df.resample('1H').bfill()

查看
resample
asfreq
。谢谢!为了帮助我理解那里发生了什么,你能添加一些评论吗?@SHV_la看看这是否有帮助。嗨,先生,你能在Pivot Q&A中添加这种(链接)类型的问题吗?我已经看到这种类型的问题超过10次了。@piRSquared如果序列从1998-01-01 00:00开始,假设回填可以使用asfreq?@piRSquared yes,添加上述时间戳确实有效;非常感谢!