为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Python中获取csv所有列中特定类别的日期时间值作为结果?

如何在Python中获取csv所有列中特定类别的日期时间值作为结果?

心有法竹 2024-01-27 16:27:29
我有一个 csv 文件,其中包含 20 天内用户社交媒体活动的值 我想获取第一天用户活动的详细信息 以下是 csv 中条目的示例DateTime                  Instagram  Facebook   Twitter(2020,09,01,10,00,00)        Y          N         Y(2020,09,01,10,01,00)        N          Y         Y(2020,09,01,10,02,00)        N          Y         N(2020,09,01,10,03,00)        N          Y         N(2020,09,01,10,04,00)        Y          N         Y(2020,09,01,11,00,00)        Y          N         N(2020,09,02,10,00,00)        N          Y         Y(2020,09,02,10,00,00)        Y          N         N(2020,09,02,10,00,00)        N          N         N(2020,09,03,10,00,00)        Y          Y         YY 代表用户处于活动状态,N 代表用户处于非活动状态 我想显示第一天(即2020-09-012020 年 9 月 1 日)所有应用程序的活动统计信息。所以我希望结果看起来像这样(只有用户在该应用程序上处于活动状态(Y)的日期时间值){'Instagram':[(2020,09,01,10,00,00),(2020,09,01,10,04,00),(2020,09,01,11,00,00)], 'Facebook':[(2020,09,01,10,01,00), (2020,09,01,10,02,00), (2020,09,01,10,03,00)], 'Twitter':[(2020,09,01,10,00,00), (2020,09,01,10,01,00), (2020,09,01,10,04,00)]}我写了一段代码,但它没有提供我想要的结果df['DateTime'] = pd.to_datetime(df['DateTime'], format='(%Y,%m,%d,%H,%M,%S)')for idx, d in df.groupby(df['DateTime'].dt.date):    print(d.drop('DateTime', axis=1).to_dict('list'))This was the result I got    {'Instagram': ['Y', 'N', 'N', 'N', 'Y', 'Y'], 'Facebook': ['N', 'Y', 'Y', 'Y', 'N', 'N'], 'Twitter': ['Y', 'Y', 'N', 'N', 'Y', 'N']}{'Instagram': ['N', 'Y', 'N'], 'Facebook': ['Y', 'N', 'N'], 'Twitter': ['Y', 'N', 'N']}{'Instagram': ['Y'], 'Facebook': ['Y'], 'Twitter': ['Y']}DateTime 列由日期时间对象格式的值组成,我将其转换为 pandas 日期时间格式
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

将值转换为新列,按 过滤第一个日期boolean indexing,然后按 unpivotDataFrame.melt和 aggreagate list


df['d'] = pd.to_datetime(df['DateTime'], format='(%Y,%m,%d,%H,%M,%S)')


day1 = df['d'].dt.date[0]

df = df[df['d'].dt.date.eq(day1)] 


df = df.melt(['DateTime','d']) 

df = df[df['value'].eq('Y')] 



d = df.groupby('variable')['DateTime'].agg(list).to_dict()

print (d)

{'Facebook': ['(2020,09,01,10,01,00)', '(2020,09,01,10,02,00)', '(2020,09,01,10,03,00)'], 

 'Instagram': ['(2020,09,01,10,00,00)', '(2020,09,01,10,04,00)', '(2020,09,01,11,00,00)'], 

 'Twitter': ['(2020,09,01,10,00,00)', '(2020,09,01,10,01,00)', '(2020,09,01,10,04,00)']}

如果需要输出datetime嵌套字典中的每个:


df['d'] = pd.to_datetime(df['DateTime'], format='(%Y,%m,%d,%H,%M,%S)')


df = df.melt(['DateTime','d']) 

df = df[df['value'].eq('Y')] 


s = df.groupby([df['d'].dt.strftime('%Y-%m-%d'), 'variable'])['DateTime'].agg(list)

print (s)


d1 = {level: s.xs(level).to_dict() for level in s.index.levels[0]}

print (d1)

{'2020-09-01': {'Facebook': ['(2020,09,01,10,01,00)', '(2020,09,01,10,02,00)', '(2020,09,01,10,03,00)'], 

                'Instagram': ['(2020,09,01,10,00,00)', '(2020,09,01,10,04,00)', '(2020,09,01,11,00,00)'],

                'Twitter': ['(2020,09,01,10,00,00)', '(2020,09,01,10,01,00)', '(2020,09,01,10,04,00)']},

 '2020-09-02': {'Facebook': ['(2020,09,02,10,00,00)'], 

                'Instagram': ['(2020,09,02,10,00,00)'], 

                'Twitter': ['(2020,09,02,10,00,00)']}, 

 '2020-09-03': {'Facebook': ['(2020,09,03,10,00,00)'], 

                'Instagram': ['(2020,09,03,10,00,00)'], 

                'Twitter': ['(2020,09,03,10,00,00)']}}


print (d1['2020-09-01'])

{'Facebook': ['(2020,09,01,10,01,00)', '(2020,09,01,10,02,00)', '(2020,09,01,10,03,00)'], 

 'Instagram': ['(2020,09,01,10,00,00)', '(2020,09,01,10,04,00)', '(2020,09,01,11,00,00)'],

 'Twitter': ['(2020,09,01,10,00,00)', '(2020,09,01,10,01,00)', '(2020,09,01,10,04,00)']}


print (d1['2020-09-02'])

{'Facebook': ['(2020,09,02,10,00,00)'], 'Instagram': ['(2020,09,02,10,00,00)'], 'Twitter': ['(2020,09,02,10,00,00)']}



查看完整回答
反对 回复 2024-01-27
?
慕森卡

TA贡献1806条经验 获得超8个赞

使用readline逐行读取file.csv。然后你应该将 Instagram 的日期时间(在“Y”的情况下,所以使用 if)收集在一个列表中。对 Facebook 和 Twitter 执行同样的操作。


所以,这是总体方法:


Instagram=[] #make an empty list

for row in file.readlines():  #read line by line of your file

    row2=row.split(';')  #split elements and make a list with name row2

    if str(row2[1])=="Y": Instagram.append(row2[0]) # add date time to instagram list

    #do the same for facebook and twitter

print(Instagram)


查看完整回答
反对 回复 2024-01-27
  • 2 回答
  • 0 关注
  • 40 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信