抱歉,我是新来的有关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语句处理了这一点,一切正常。
答案 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')