在python pandas中选择最接近某个小时的时间

Posted

技术标签:

【中文标题】在python pandas中选择最接近某个小时的时间【英文标题】:Select closest time to a certain hour in python pandas 【发布时间】:2018-01-07 13:03:40 【问题描述】:

我正在寻找是否有办法将壁橱时间选择到某个小时。我有以下。该文件包含 10 年的数据,我已将其缩小到一些我想保留的时间序列。

import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
from matplotlib.pyplot import *
import datetime
import numpy as np

dateparse = lambda x: pd.datetime.strptime(x, "%d:%m:%Y %H:%M:%S")
aeronet = pd.read_csv('somefile', skiprows = 4, na_values = ['N/A'], parse_dates='times':[0,1], date_parser=dateparse)
aeronet = aeronet.set_index('times')
del aeronet['Julian_Day']

aeronet.between_time('06:00:00', '07:00:00'), aeronet.between_time('12:00:00', '13:00:00')

我选择了一个这样的sn-p。有没有这样一种方法可以选择最接近 06 或 12 的时间及其内容并丢弃/忽略 pandas 系列中的其余部分,并对整个文件执行此操作?

times                AOT_1640  AOT_1020  AOT_870   AOT_675    AOT_667   AOT_555 ...
2000-08-07 06:49:10       NaN  0.380411  0.406041  0.445789      NaN      NaN   
2000-08-07 06:57:36       NaN  0.353378  0.377769  0.420168      NaN      NaN   
2000-08-08 06:31:00       NaN  0.322402  0.338164  0.364679      NaN      NaN   
2000-08-08 06:33:28       NaN  0.337819  0.353995  0.381201      NaN      NaN   
2000-08-08 06:36:26       NaN  0.347656  0.361839  0.390342      NaN      NaN   
2000-08-08 06:51:50       NaN  0.306449  0.325672  0.351885      NaN      NaN   
2000-08-08 06:54:23       NaN  0.336512  0.355386  0.380230      NaN      NaN   
2000-08-08 06:57:20       NaN  0.330028  0.345679  0.373780      NaN      NaN   
2000-08-09 06:34:56       NaN  0.290533  0.306911  0.336597      NaN      NaN   
2000-08-09 06:41:53       NaN  0.294413  0.311553  0.343473      NaN      NaN   
2000-08-09 06:49:45       NaN  0.311042  0.332054  0.360999      NaN      NaN   
2000-08-09 06:52:15       NaN  0.319396  0.339932  0.369617      NaN      NaN   
2000-08-09 06:55:20       NaN  0.327440  0.349084  0.378345      NaN      NaN   
2000-08-09 06:58:23       NaN  0.323247  0.345273  0.373879      NaN      NaN   
2000-08-12 06:30:01       NaN  0.465173  0.471528  0.483079      NaN      NaN   
2000-08-12 06:33:05       NaN  0.460013  0.465674  0.479500      NaN      NaN   
2000-08-12 06:35:59       NaN  0.433161  0.438488  0.453779      NaN      NaN   
2000-08-12 06:42:12       NaN  0.406479  0.415580  0.432160      NaN      NaN   
2000-08-12 06:50:06       NaN  0.414227  0.424330  0.439448      NaN      NaN   
2000-08-12 06:57:21       NaN  0.396034  0.404258  0.423866      NaN      NaN   
2000-08-12 06:59:47       NaN  0.372097  0.380798  0.401600      NaN      NaN 
[6200 rows x 42 columns]

...

times                AOT_1640  AOT_1020  AOT_870   AOT_675    AOT_667   AOT_555 ...
2000-01-01 12:23:54       NaN  0.513307  0.557325  0.653497      NaN      NaN   
2000-01-03 12:24:49       NaN  0.439142  0.494118  0.593997      NaN      NaN   
2000-01-03 12:39:49       NaN  0.429130  0.477874  0.577334      NaN      NaN   
2000-01-03 12:54:48       NaN  0.437720  0.489006  0.586224      NaN      NaN   
2000-01-04 12:10:30       NaN  0.325203  0.362335  0.426348      NaN      NaN   
2000-01-04 12:25:15       NaN  0.323978  0.356274  0.423620      NaN      NaN   
2000-01-04 12:40:15       NaN  0.325356  0.361138  0.427271      NaN      NaN   
2000-01-04 12:55:14       NaN  0.326595  0.363519  0.431527      NaN      NaN   
2000-01-06 12:11:08       NaN  0.282777  0.307676  0.369811      NaN      NaN   
2000-01-06 12:26:09       NaN  0.285853  0.314178  0.374832      NaN      NaN   
2000-01-06 12:41:08       NaN  0.258836  0.289263  0.346880      NaN      NaN   
2000-01-08 12:12:04       NaN  0.165473  0.185018  0.235770      NaN      NaN   
2000-01-08 12:42:01       NaN  0.143540  0.164647  0.216335      NaN      NaN   
2000-01-08 12:57:01       NaN  0.142760  0.164886  0.215461      NaN      NaN   
2000-01-10 12:12:52       NaN  0.192453  0.225909  0.310540      NaN      NaN   
2000-01-10 12:27:53       NaN  0.202532  0.238400  0.322692      NaN      NaN   
2000-01-10 12:42:52       NaN  0.199996  0.235561  0.320756      NaN      NaN   
2000-01-10 12:57:52       NaN  0.208046  0.245054  0.331214      NaN      NaN   
2000-01-11 12:13:19       NaN  0.588879  0.646470  0.750459      NaN      NaN   
2000-01-11 12:28:17       NaN  0.621813  0.680442  0.788457      NaN      NaN   
2000-01-11 12:43:17       NaN  0.626547  0.685880  0.790631      NaN      NaN   
2000-01-11 12:58:16       NaN  0.631142  0.689125  0.796060      NaN      NaN   
2000-01-12 12:28:42       NaN  0.535105  0.584593  0.688904      NaN      NaN   
2000-01-12 12:43:41       NaN  0.518697  0.571025  0.676406      NaN      NaN   
2000-01-12 12:58:40       NaN  0.528318  0.583229  0.687795      NaN      NaN   
2000-01-13 12:14:20       NaN  0.382645  0.419463  0.496089      NaN      NaN   
2000-01-13 12:29:05       NaN  0.376186  0.414921  0.491920      NaN      NaN   
2000-01-13 12:44:05       NaN  0.387845  0.424576  0.501968      NaN      NaN   
2000-01-13 12:59:04       NaN  0.386237  0.423254  0.503163      NaN      NaN   
2000-01-14 12:14:43       NaN  0.400024  0.425522  0.485719      NaN      NaN   

[6672 rows x 42 columns])

当我打印出来时,aeronet 数据框看起来与此类似吗?我希望要么仍然对其进行一些计算,要么将其导出到 excel。

times                AOT_1640  AOT_1020  AOT_870   AOT_675    AOT_667   AOT_555 ...
2000-08-07 06:49:10       NaN  0.380411  0.406041  0.445789      NaN      NaN
2000-08-08 06:31:00       NaN  0.322402  0.338164  0.364679      NaN      NaN 
2000-08-09 06:34:56       NaN  0.290533  0.306911  0.336597      NaN      NaN  
2000-08-12 06:30:01       NaN  0.465173  0.471528  0.483079      NaN      NaN 
....
2000-01-01 12:23:54       NaN  0.513307  0.557325  0.653497      NaN      NaN  
2000-01-03 12:24:49       NaN  0.439142  0.494118  0.593997      NaN      NaN 
2000-01-04 12:10:30       NaN  0.325203  0.362335  0.426348      NaN      NaN   
2000-01-06 12:11:08       NaN  0.282777  0.307676  0.369811      NaN      NaN 
2000-01-08 12:12:04       NaN  0.165473  0.185018  0.235770      NaN      NaN   
2000-01-10 12:12:52       NaN  0.192453  0.225909  0.310540      NaN      NaN  
2000-01-11 12:13:19       NaN  0.588879  0.646470  0.750459      NaN      NaN  
2000-01-12 12:28:42       NaN  0.535105  0.584593  0.688904      NaN      NaN  
2000-01-13 12:14:20       NaN  0.382645  0.419463  0.496089      NaN      NaN   
2000-01-14 12:14:43       NaN  0.400024  0.425522  0.485719      NaN      NaN   

【问题讨论】:

【参考方案1】:

这可能是一种更有效的方法,但我认为这样可以完成工作。

首先,添加日期和时间字段:

aeronet['date'] = aeronet.times.dt.date
aeronet['time'] = aeronet.times.dt.time

现在,aeronet.date.unique() 为您提供唯一日期的列表。稍后您将需要它。

dates = aeronet.date.unique()

创建一个列,给出从早上 6 点开始的绝对距离

from datetime import date, datetime, time
sixam = time(6,0,0,0)

def fromsix(time):
    abs(datetime.combine(date.min, time) - datetime.combine(date.min, sixam))

aeronet['fromsix'] = aeronet.time.apply(fromsix)

datetime.combine 是必要的,因为显然你不能只减去两次。

现在,终于,

pd.concat([aeronet[aeronet.date == date][aeronet.fromsix == aeronet[aeronet.date == date].fromsix.min()] for date in dates])

使用列表推导将数据框分割成单独的日期,找到距六点钟距离最小的元素,然后将它们连接在一起。

【讨论】:

因为 aeronet = aeronet.set_index('times') 不是列,而是索引,所以它不起作用。但是,通过消除这行代码,我取得了进展,但似乎挂断了该功能。我打印出来的函数只为每一行返回“无”。当它被 catatnated 时,它会发出警告 UserWarning: Boolean Series key will be reindexed to match DataFrame index. """启动 IPython 内核的入口点。【参考方案2】:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.merge_asof.html

这就是要走的路,伙计。高效、简单、快速。

【讨论】:

我该怎么做。因为我只有一个数据框(aeronet)。我在技术上与什么合并?

以上是关于在python pandas中选择最接近某个小时的时间的主要内容,如果未能解决你的问题,请参考以下文章

[Python] 寻找一个ndarray中最接近某个值的点index

在 pandas 数据框中获取几年内工作日某个小时的平均值

Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数

pandas,python - 如何在时间序列中选择特定时间

如何将(round)纪元时间转换为最接近的小时和日期wrt IST(在Java中)

Pandas - 将时间戳四舍五入到最接近的秒数