拆分日期时间,蟒蛇,熊猫

时间:2018-04-06 08:31:32

标签: python pandas datetime time-series

抱歉,我是新来的有关stackoverflow的问题,所以我不明白如何正确格式化。

所以我给出了一个Pandas数据框,其中包含datetime列,其中包含日期和时间以及包含某种值的关联列。给定的日期和时间按小时递增。我想操纵数据帧让它们每15分钟递增一次,但保留相同的值。我该怎么办?谢谢!

我试过了:

df = df.asfreq('15Min',method='ffill')

但是我收到了一个错误:

  

" TypeError:无法比较类型'时间戳'类型'长'"

当前数据框:

datetime     value  
00:00:00     1  
01:00:00     2

新数据框:

datetime     value  
00:00:00     1  
00:15:00     1  
00:30:00     1  
00:45:00     1  
01:00:00     2    
01:15:00     2  
01:30:00     2  
01:45:00     2    

更新:
下面批准的答案有效,但我在上面尝试的初始代码也是如此  df = df.asfreq('15Min',method='ffill')。我正在搞乱其他Dataframes,我似乎遇到了一些空值的问题,所以我用fillna语句处理了这一点,一切正常。

2 个答案:

答案 0 :(得分:3)

您可以使用TimedeltaIndex,但必须手动为正确的reindex添加最后一个值:

df['datetime'] = pd.to_timedelta(df['datetime'])
df = df.set_index('datetime')
tr = pd.timedelta_range(df.index.min(), 
                        df.index.max() + pd.Timedelta(45*60, unit='s'), freq='15Min')
df = df.reindex(tr, method='ffill')
print (df)
          value
00:00:00      1
00:15:00      1
00:30:00      1
00:45:00      1
01:00:00      2
01:15:00      2
01:30:00      2
01:45:00      2

另一个resample和同样问题的解决方案 - 需要附加新值才能正确附加最后一个值:

df['datetime'] = pd.to_timedelta(df['datetime'])
df = df.set_index('datetime')
df.loc[df.index.max() + pd.Timedelta(1, unit='h')] = 1

df = df.resample('15Min').ffill().iloc[:-1]
print (df)
          value
datetime       
00:00:00      1
00:15:00      1
00:30:00      1
00:45:00      1
01:00:00      2
01:15:00      2
01:30:00      2
01:45:00      2

但如果值是日期时间:

print (df)
              datetime  value
0  2018-01-01 00:00:00      1
1  2018-01-01 01:00:00      2

df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime')
tr = pd.date_range(df.index.min(), 
                   df.index.max() + pd.Timedelta(45*60, unit='s'), freq='15Min')
df = df.reindex(tr, method='ffill')
df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime')
df.loc[df.index.max() + pd.Timedelta(1, unit='h')] = 1

df = df.resample('15Min').ffill().iloc[:-1]
print (df)

                     value
datetime                  
2018-01-01 00:00:00      1
2018-01-01 00:15:00      1
2018-01-01 00:30:00      1
2018-01-01 00:45:00      1
2018-01-01 01:00:00      2
2018-01-01 01:15:00      2
2018-01-01 01:30:00      2
2018-01-01 01:45:00      2

答案 1 :(得分:1)

您可以使用pandas.daterange

pd.date_range('00:00:00', '01:00:00', freq='15T')