【问题标题】:How to get datetime value as a result for a paticular category in all columns of a csv in Python?python - 如何在Python中的csv的所有列中获取特定类别的日期时间值?
【发布时间】:2020-10-29 08:35:16
【问题描述】:

我有一个包含 20 天用户社交媒体活动值的 csv 文件我想获取第 1 天用户活动的详细信息这是 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         Y

Y 代表用户处于活动状态,N 代表用户处于非活动状态 我想显示第 1 天所有应用的活动统计信息,即2020-09-01(2020 年 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 日期时间格式

【问题讨论】:

  • 输出只针对一个日期,第一天?
  • 是的,仅限第一天

标签: python pandas datetime


【解决方案1】:

将值转换为新列,按boolean indexing 过滤第一个日期,然后按DataFrame.melt 取消透视并聚合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)']}

【讨论】:

  • @GlenVeigas - 谢谢,很高兴为您提供帮助。不要忘记接受答案,如果它适合你! :)
  • 当我在 Colab\Jupyter 上运行第一个解决方案时,它工作得非常好,但是当我通过 .py 文件在终端上运行它时,我收到此错误:TypeError: 'type' object is not iterable
  • 错误指向d = df.groupby('variable')['DateTime'].agg(list).to_dict()
  • @GlenVeigas - 在我的数据解决方案之前print (type(df.loc[0, 'DateTime'])) 是什么,失败了?
  • <class 'pandas._libs.tslib.Timestamp'>
【解决方案2】:

使用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)

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 2020-01-16
    • 2012-06-24
    • 1970-01-01
    • 2021-10-25
    • 2021-11-07
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多