Python: 如何在 pandas 0.9.0 上开发一个 between_time 类似的方法?
Python: How to develop a between_time similar method when on pandas 0.9.0?
我坚持使用 pandas 0.9.0,因为我在 python 2.5 下工作,因此我没有可用的 between_time 方法。
我有一个日期数据框,想过滤特定时间之间的所有日期,例如对于 DataFrame df
.
中的所有日期,在 08:00
和 09:00
之间
import pandas as pd
import numpy as np
import datetime
dates = pd.date_range(start="08/01/2009",end="08/01/2012",freq="10min")
df = pd.DataFrame(np.random.rand(len(dates), 1)*1500, index=dates, columns=['Power'])
我如何开发一个提供与 between_time
方法相同功能的方法?
N.B.: 原来我要解决的问题在
下
更新:
尝试使用:
df.loc[df.index.indexer_between_time('08:00','09:50')]
旧答案:
我不确定它是否适用于 Pandas 0.9.0,但值得一试:
df[(df.index.hour >= 8) & (df.index.hour <= 9)]
PS 请注意 - 它与 between_time
不同,因为它只检查小时数,而 between_time
能够检查 time喜欢 df.between_time('08:01:15','09:13:28')
提示:下载Pandas较新版本的源代码并查看[=16=中indexer_between_time()
函数的定义] - 您可以根据需要克隆它
更新: 从 Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers 开始。
这是一种基于 NumPy 的方法:
import pandas as pd
import numpy as np
import datetime
dates = pd.date_range(start="08/01/2009",end="08/01/2012",freq="10min")
df = pd.DataFrame(np.random.rand(len(dates), 1)*1500, index=dates, columns=['Power'])
epoch = np.datetime64('1970-01-01')
start = np.datetime64('1970-01-01 08:00:00')
end = np.datetime64('1970-01-01 09:00:00')
# convert the dates to a NumPy datetime64 array
date_array = df.index.asi8.astype('<M8[ns]')
# replace the year/month/day with 1970-01-01
truncated = (date_array - date_array.astype('M8[D]')) + epoch
# compare the hour/minute/seconds etc with `start` and `end`
mask = (start <= truncated) & (truncated <=end)
print(df[mask])
产量
Power
2009-08-01 08:00:00 1007.289466
2009-08-01 08:10:00 770.732422
2009-08-01 08:20:00 617.388909
2009-08-01 08:30:00 1348.384210
...
2012-07-31 08:30:00 999.133350
2012-07-31 08:40:00 1451.500408
2012-07-31 08:50:00 1161.003167
2012-07-31 09:00:00 670.545371
我坚持使用 pandas 0.9.0,因为我在 python 2.5 下工作,因此我没有可用的 between_time 方法。
我有一个日期数据框,想过滤特定时间之间的所有日期,例如对于 DataFrame df
.
08:00
和 09:00
之间
import pandas as pd
import numpy as np
import datetime
dates = pd.date_range(start="08/01/2009",end="08/01/2012",freq="10min")
df = pd.DataFrame(np.random.rand(len(dates), 1)*1500, index=dates, columns=['Power'])
我如何开发一个提供与 between_time
方法相同功能的方法?
N.B.: 原来我要解决的问题在
更新:
尝试使用:
df.loc[df.index.indexer_between_time('08:00','09:50')]
旧答案:
我不确定它是否适用于 Pandas 0.9.0,但值得一试:
df[(df.index.hour >= 8) & (df.index.hour <= 9)]
PS 请注意 - 它与 between_time
不同,因为它只检查小时数,而 between_time
能够检查 time喜欢 df.between_time('08:01:15','09:13:28')
提示:下载Pandas较新版本的源代码并查看[=16=中indexer_between_time()
函数的定义] - 您可以根据需要克隆它
更新: 从 Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers 开始。
这是一种基于 NumPy 的方法:
import pandas as pd
import numpy as np
import datetime
dates = pd.date_range(start="08/01/2009",end="08/01/2012",freq="10min")
df = pd.DataFrame(np.random.rand(len(dates), 1)*1500, index=dates, columns=['Power'])
epoch = np.datetime64('1970-01-01')
start = np.datetime64('1970-01-01 08:00:00')
end = np.datetime64('1970-01-01 09:00:00')
# convert the dates to a NumPy datetime64 array
date_array = df.index.asi8.astype('<M8[ns]')
# replace the year/month/day with 1970-01-01
truncated = (date_array - date_array.astype('M8[D]')) + epoch
# compare the hour/minute/seconds etc with `start` and `end`
mask = (start <= truncated) & (truncated <=end)
print(df[mask])
产量
Power
2009-08-01 08:00:00 1007.289466
2009-08-01 08:10:00 770.732422
2009-08-01 08:20:00 617.388909
2009-08-01 08:30:00 1348.384210
...
2012-07-31 08:30:00 999.133350
2012-07-31 08:40:00 1451.500408
2012-07-31 08:50:00 1161.003167
2012-07-31 09:00:00 670.545371