Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在大熊猫数据框中分割日、时、分、秒数据?_Python_Pandas_Csv_Split_Bigdata - Fatal编程技术网

Python 如何在大熊猫数据框中分割日、时、分、秒数据?

Python 如何在大熊猫数据框中分割日、时、分、秒数据?,python,pandas,csv,split,bigdata,Python,Pandas,Csv,Split,Bigdata,我是Python新手,我正在为一门数据科学课做一个项目。我有一个很大的csv文件(大约1.9亿行,大约7GB的数据),首先,我需要做一些数据准备 完整免责声明:这里的数据来自此 下面是Jupyter笔记本上的一张带有标题的图片。虽然它读取的是full_data.head(),但我使用了一个100000行的示例来测试代码。 最重要的一列是单击时间。格式为:dd hh:mm:ss。我想把它分成4列:天、小时、分钟和秒。我已经找到了一个可以很好地处理这个小文件的解决方案,但是在10%的真实数据上运行

我是Python新手,我正在为一门数据科学课做一个项目。我有一个很大的csv文件(大约1.9亿行,大约7GB的数据),首先,我需要做一些数据准备

完整免责声明:这里的数据来自此

下面是Jupyter笔记本上的一张带有标题的图片。虽然它读取的是
full_data.head()
,但我使用了一个100000行的示例来测试代码。

最重要的一列是
单击时间
。格式为:
dd hh:mm:ss
。我想把它分成4列:天、小时、分钟和秒。我已经找到了一个可以很好地处理这个小文件的解决方案,但是在10%的真实数据上运行需要很长时间,更不用说在100%的真实数据上运行了(因为现在读取完整的csv是一个大问题,所以我甚至没能尝试)

这是:

# First I need to split the values
click = full_data['click_time']
del full_data['click_time']
click = click.str.replace(' ', ':')
click = click.str.split(':')

# Then I transform everything into integers. The last piece of code
# returns an array of lists, one for each line, and each list has 4
# elements. I couldn't figure out another way of making this conversion
click = click.apply(lambda x: list(map(int, x)))

# Now I transform everything into unidimensional arrays
day = np.zeros(len(click), dtype = 'uint8')
hour = np.zeros(len(click), dtype = 'uint8')
minute = np.zeros(len(click), dtype = 'uint8')
second = np.zeros(len(click), dtype = 'uint8')
for i in range(0, len(click)):
    day[i] = click[i][0]
    hour[i] = click[i][1]
    minute[i] = click[i][2]
    second[i] = click[i][3]
del click

# Transforming everything to a Pandas series
day = pd.Series(day, index = full_data.index, dtype = 'uint8')
hour = pd.Series(hour, index = full_data.index, dtype = 'uint8')
minute = pd.Series(minute, index = full_data.index, dtype = 'uint8')
second = pd.Series(second, index = full_data.index, dtype = 'uint8')

# Adding to data frame
full_data['day'] = day
del day
full_data['hour'] = hour
del hour
full_data['minute'] = minute
del minute
full_data['second'] = second
del second
结果还可以,这正是我想要的,但必须有一种更快的方法:

关于如何改进此实施有何想法?如果有人对数据集感兴趣,请访问test_sample.csv:

提前多谢


编辑1:在@COLDSPEED请求之后,我提供了
完整数据.head.to_dict()的结果。


一种解决方案是首先按空格分割,然后转换为
datetime
对象,然后直接提取组件

import pandas as pd

df = pd.DataFrame({'click_time': ['07 09:30:38', '07 13:40:27', '07 18:05:24',
                                  '07 04:58:08', '09 09:00:09', '09 01:22:13',
                                  '09 01:17:58', '07 10:01:53', '08 09:35:17',
                                  '08 12:35:26']})

df[['day', 'time']] = df['click_time'].str.split().apply(pd.Series)
df['datetime'] = pd.to_datetime(df['time'])

df['day'] = df['day'].astype(int)
df['hour'] = df['datetime'].dt.hour
df['minute'] = df['datetime'].dt.minute
df['second'] = df['datetime'].dt.second

df = df.drop(['time', 'datetime'], 1)
结果

    click_time  day  hour  minute  second
0  07 09:30:38    7     9      30      38
1  07 13:40:27    7    13      40      27
2  07 18:05:24    7    18       5      24
3  07 04:58:08    7     4      58       8
4  09 09:00:09    9     9       0       9
5  09 01:22:13    9     1      22      13
6  09 01:17:58    9     1      17      58
7  07 10:01:53    7    10       1      53
8  08 09:35:17    8     9      35      17
9  08 12:35:26    8    12      35      26

一种解决方案是首先按空格分割,然后转换为
datetime
对象,然后直接提取组件

import pandas as pd

df = pd.DataFrame({'click_time': ['07 09:30:38', '07 13:40:27', '07 18:05:24',
                                  '07 04:58:08', '09 09:00:09', '09 01:22:13',
                                  '09 01:17:58', '07 10:01:53', '08 09:35:17',
                                  '08 12:35:26']})

df[['day', 'time']] = df['click_time'].str.split().apply(pd.Series)
df['datetime'] = pd.to_datetime(df['time'])

df['day'] = df['day'].astype(int)
df['hour'] = df['datetime'].dt.hour
df['minute'] = df['datetime'].dt.minute
df['second'] = df['datetime'].dt.second

df = df.drop(['time', 'datetime'], 1)
结果

    click_time  day  hour  minute  second
0  07 09:30:38    7     9      30      38
1  07 13:40:27    7    13      40      27
2  07 18:05:24    7    18       5      24
3  07 04:58:08    7     4      58       8
4  09 09:00:09    9     9       0       9
5  09 01:22:13    9     1      22      13
6  09 01:17:58    9     1      17      58
7  07 10:01:53    7    10       1      53
8  08 09:35:17    8     9      35      17
9  08 12:35:26    8    12      35      26

转换为
timedelta
并提取组件:

v = df.click_time.str.split()

df['days'] = v.str[0].astype(int)
df[['hours', 'minutes', 'seconds']] = (
      pd.to_timedelta(v.str[-1]).dt.components.iloc[:, 1:4]
)


转换为
timedelta
并提取组件:

v = df.click_time.str.split()

df['days'] = v.str[0].astype(int)
df[['hours', 'minutes', 'seconds']] = (
      pd.to_timedelta(v.str[-1]).dt.components.iloc[:, 1:4]
)


请做
full_data.head()。to_dict()
并在您的问题中发布数据,重现您的示例并不容易。刚刚完成,谢谢!谢谢,这很有帮助。请执行
完整的\u data.head()。到\u dict()
并将数据发布到您的问题中,重现您的示例并不容易。刚刚完成,谢谢!谢谢,这很有帮助。谢谢你的回答!谢谢你的回答!成功了!虽然花的时间比我想象的要多。运行10%的完整数据(MacBookPro i5,8GB内存)大约需要5分钟。这是一个非常干净的实现,非常感谢!我所做的唯一修改是将数字类型指定为
uint8
。它确实会对内存使用产生影响。再次感谢!成功了!虽然花的时间比我想象的要多。运行10%的完整数据(MacBookPro i5,8GB内存)大约需要5分钟。这是一个非常干净的实现,非常感谢!我所做的唯一修改是将数字类型指定为
uint8
。它确实会对内存使用产生影响。再次感谢!