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

时间:2017-07-31 20:24:04

标签: python pandas time-series

我正在寻找是否有办法选择一个小时的壁橱时间。我有以下内容。该文件包含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')

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

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数据框看起来与此相似?我希望仍然可以使用它进行一些计算或将其导出为ex​​cel。

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   

2 个答案:

答案 0 :(得分:0)

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

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

select type,
       (case when count(*) = 1 then max(message) else count(*)::text end) as message,
       min(created_at) as new_createdAt
from (select t.*,
             row_number() over (order by createdAt) as seqnum_c,
             row_number() over (partition by type order by createdAt) as seqnum_tc
      from t
     ) t
group by type, (seqnum_c - seqnum_tc)
order by new_createdAt;

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

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

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

dates = aeronet.date.unique()

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

现在,最后,

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)

使用列表推导将数据帧切割成单独的日期,找到距离早上六点的距离最小的元素,并将它们连接在一起。

答案 1 :(得分:0)

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

这就是去哥们的方式。高效,简单,快捷。