在csv中获取每个日期的最小和最大时间

时间:2019-10-15 18:56:02

标签: python pandas dataset data-science

我对Datascience和Python还是个新手。

首先,您是否建议在处理庞大的数据集(超过10万行)时使用除熊猫以外的其他任何库?

第二,lemme向您展示了我当前的问题。

为了方便理解,我有一个数据集,其中有一个Datetime列,假设我只有一个名为date_col的Datetime列。

我的date_col值如下所示:

df=pd.DataFrame({'dt_col': ["2019-03-13 08:12:23", "2019-03-13 07:10:18", "2019-03-13 08:12:23", "2019-03-15 10:35:53", "2019-03-20 11:12:23", "2019-03-20 08:12:23"]})

                dt_col
0  2019-03-13 08:12:23
1  2019-03-13 07:10:18
2  2019-03-13 08:12:23
3  2019-03-15 10:35:53
4  2019-03-20 11:12:23
5  2019-03-20 08:12:23

我想分别提取每天的最小和最大小时数或datetime,例如2019-03-13,我想提取2019-03-13 07:10:182019-03-13 08:12:23

我对:

  1. 从我的DataFrame中获取没有时间的区别日期
  2. 针对这些日期,从我的数据框中获取最小和最大对应日期

我有点停留在第2步,因为我不知道如何在Python中真正实现这一目标,我的意思是我可以通过一些循环以“旧方式”完成此操作,但我认为它不会用大数据集。

顺便说一句,这是我为第1步所做的事情

dates=pd.to_datetime(df.dt_col)
distinc_dates=dates.dt.strftime("%Y-%m-%d").unique()

一旦我获得了最小和最大日期,我想在每个最小和最大日期时间之间生成日期时间行,例如在2019-03-13 07:10:182019-03-13 08:12:23之间,我想获取2019-03-13 07:10:18,{ {1}},2019-03-13 07:10:192019-03-13 07:10:202019-03-13 07:10:21,.....直到2019-03-13 07:10:22

我认为可以使用2019-03-13 08:12:23来实现。因此,一旦获得最小值和最大值,我就认为用户可以使用pd.date_range来执行以下操作:

pd.date_tange

但是我知道itsrows的速度很慢,所以我问你们拥有巨大数据集时实现此目标的最佳方法。

1 个答案:

答案 0 :(得分:0)

如果dt_col不是dtype datetime,则需要将其转换为日期时间

df.dt_col = pd.to_datetime(df.dt_col)

下一步,尝试这个

df1 = df.groupby(df.dt_col.dt.date).dt_col.agg(['min', 'max'])

Out[555]:
                           min                 max
dt_col
2019-03-13 2019-03-13 07:10:18 2019-03-13 08:12:23
2019-03-15 2019-03-15 10:35:53 2019-03-15 10:35:53
2019-03-20 2019-03-20 08:12:23 2019-03-20 11:12:23

具有最小值和最大值之后。您可以通过pd.date_range或重新采样以秒为单位创建范围。我认为带有listcomp的pd.date_range可能会在您的情况下更快地重新采样。在这里

time_arr = [pd.date_range(df1.loc[ix,'min'], df1.loc[ix,'max'], freq='S') 
                       for ix in df1.index]

time_arr = [pd.date_range(x[0], x[1], freq='S') for x in df1.values]

Out[640]:
[DatetimeIndex(['2019-03-13 07:10:18', '2019-03-13 07:10:19',
                '2019-03-13 07:10:20', '2019-03-13 07:10:21',
                '2019-03-13 07:10:22', '2019-03-13 07:10:23',
                '2019-03-13 07:10:24', '2019-03-13 07:10:25',
                '2019-03-13 07:10:26', '2019-03-13 07:10:27',
                ...
                '2019-03-13 08:12:14', '2019-03-13 08:12:15',
                '2019-03-13 08:12:16', '2019-03-13 08:12:17',
                '2019-03-13 08:12:18', '2019-03-13 08:12:19',
                '2019-03-13 08:12:20', '2019-03-13 08:12:21',
                '2019-03-13 08:12:22', '2019-03-13 08:12:23'],
               dtype='datetime64[ns]', length=3726, freq='S'),
 DatetimeIndex(['2019-03-15 10:35:53'], dtype='datetime64[ns]', freq='S'),
 DatetimeIndex(['2019-03-20 08:12:23', '2019-03-20 08:12:24',
                '2019-03-20 08:12:25', '2019-03-20 08:12:26',
                '2019-03-20 08:12:27', '2019-03-20 08:12:28',
                '2019-03-20 08:12:29', '2019-03-20 08:12:30',
                '2019-03-20 08:12:31', '2019-03-20 08:12:32',
                ...
                '2019-03-20 11:12:14', '2019-03-20 11:12:15',
                '2019-03-20 11:12:16', '2019-03-20 11:12:17',
                '2019-03-20 11:12:18', '2019-03-20 11:12:19',
                '2019-03-20 11:12:20', '2019-03-20 11:12:21',
                '2019-03-20 11:12:22', '2019-03-20 11:12:23'],
               dtype='datetime64[ns]', length=10801, freq='S')]

注意:如果数据集太大并以秒为单位创建范围,则可能会耗尽内存并崩溃。