2015-10-02 31 views
0

我从205MB csv(大约110万行15列)创建了一个熊猫数据框。它包含一个名为starttime的列,它是dtype object(它更精确地是一个字符串)。格式如下:7/1/2015 00:00:03熊猫组由单个列中的多个值组成

我想从这个熊猫数据框中创建两个新的数据框。一个应该包含与周末日期相对应的所有行,另一个应该包含与周日日期对应的所有行。

周末日期为:

weekends = ['7/4/2015', '7/5/2015', '7/11/2015', '7/12/2015', 
      '7/18/2015', '7/19/2015', '7/25/2015', '7,26/2015'] 

我试图将字符串转换成datetime(pd.to_datetime)希望这将使该值容易解析,但是当我做这么久,我最终重新启动挂起内核几次。

然后我决定使用df["date"], df["time"] = zip(*df['starttime'].str.split(' ').tolist())在原始数据框(一个用于日期,一个用于时间)中创建两个新列。接下来,我想我会使用布尔测试来标记周末记录(根据新的date字段)为True和所有其他人False并创建另一列,保存这些值,然后我可以按TrueFalse

例如, test1 = bikes['date'] == '7/1/2015'回报True对所有2015年7月1日值,但我无法弄清楚如何遍历所有项目中weekends,使我得到True所有周末的日期。我想这和Python的爆发(再次挂断):

for i in weekends: 
    for k in df['date']: 
     test2 = df['date'] == i 

我想感谢所有帮助(既我的逻辑和我的代码)。

+1

你应该能够解析该字符串,而因此,如果您通过任一列名称或序值'read_csv'那就在它读成一个日期在CSV阅读好:'pd.read_csv(file,parse_dates = ['starttime'])'应该可以工作,那么你可以直接调用'df ['starttime']。dt.dayofweek',所有的周末都是那些值为'[5 ,6]' – EdChum

+0

@EdChum感谢您的建议,但我收到了'只能使用.dt访问器和datetimelike values'错误。我认为这是因为'starttime'是一个字符串。 – dstar

+0

您尚未说明您是否已尝试像使用'parse_dates'解析字符串,您需要在从csv读取作为后处理步骤的解析过程中出于某种原因导致您的计算机冻结这是不应该 – EdChum

回答

1

首先,创建一个字符串时间戳的数据帧与1.1米行:

df = pd.DataFrame({'date': ['7/1/2015 00:00:03', '7/1/2015 00:00:04'] * 550000}) 

接下来,你可以简单地将它们转换为大熊猫时间戳如下:

df['ts'] = pd.to_datetime(df.date) 

操作两下,刚上任分钟。然而,花了不到7数秒如果你指定的格式:

df['ts'] = pd.to_datetime(df.date, format='%m/%d/%Y %H:%M:%S') 

现在,它是很容易建立一个周末标志如下(历时约3秒):

df['weekend'] = [d.weekday() >= 5 for d in df.ts] 

最后,很容易的子集数据框,这需要几乎没有时间:

df_weekdays = df.loc[~df.weekend, :] 
df_weekends = df.loc[df.weekend, :] 

周末标志是帮助解释发生了什么。您可以简化为:

df_weekdays = df.loc[df.ts.apply(lambda ts: ts.weekday() < 5), :] 
df_weekends = df.loc[df.ts.apply(lambda ts: ts.weekday() >= 5), :] 
+0

感谢您的协助。你绝对正确,它是超快的。 – dstar