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

Posted

技术标签:

【中文标题】获取csv中每个日期的最小和最大日期时间【英文标题】:Getting min and max datime for each date in csv 【发布时间】:2020-02-12 12:15:12 【问题描述】:

我对数据科学和 Python 有点陌生。

首先,在处理庞大的数据集(100K+ 行)时,您是否建议使用除 pandas 之外的任何其他库?

其次,让我告诉你我目前的问题。

我有一个数据集,其中有一个 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

我很担心:

    从我的 DataFrame 中获取不带时间的不同日期 Foreach 这些日期,从我的 Dataframe 中获取最小和最大对应日期

我有点卡在第 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:182019-03-13 07:10:192019-03-13 07:10:202019-03-13 07:10:212019-03-13 07:10:22,......直到2019-03-13 08:12:23

我认为这可以使用pd.date_range 来实现。所以一旦我得到了我的最小值和最大值,我想用户使用pd.date_tange 来做这样的事情:

dates=[]
for index,row in df.iterrows():
    dates.append(pd.date_range(start=row['min'], end=row['max'], freq='1S'))
print(dates)

但我知道 iterrows asf 很慢,所以我问你们在拥有庞大数据集时实现这一目标的最佳方法。

【问题讨论】:

【参考方案1】:

如果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 或重新采样以秒为单位创建范围。我认为 pd.date_range 与 listcomp 在您的情况下可能会更快地重新采样。在这里

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')]

注意:如果您的数据集太大并且您按秒创建范围,您可能会耗尽内存并崩溃。

【讨论】:

是否有一个快捷方式可以使用带有 pd.date_range 的 min 和 max 来在它们之间生成一个 datetime foreach ?还是我必须用一个循环来处理它? @lefragan:您能否编辑问题以添加更多详细信息和示例? 是的,抱歉,我一开始就应该这样做。现在完成了 @Arès:你可以使用列表推导。它比 iterrows 循环更快。检查我的编辑。

以上是关于获取csv中每个日期的最小和最大日期时间的主要内容,如果未能解决你的问题,请参考以下文章

查找每个 ID 的特定日期之前的最大日期和特定日期之后的最小日期 [关闭]

从熊猫数据框中获取最小和最大日期

用于创建具有数据框中每个日期的最小值和最大值的表的函数

Oracle - 从一组行中获取最小和最大日期

在一个范围内选择最大和最小日期时间

从 pandas 的时间序列范围中查找最小和最大日期