熊猫从python中的日期字符串列获取日期值

Posted

技术标签:

【中文标题】熊猫从python中的日期字符串列获取日期值【英文标题】:Pandas get day value from date string column in python 【发布时间】:2017-05-07 05:25:01 【问题描述】:

读取数据集:

visits=   pd.read_csv('tracker.csv', low_memory=False, parse_dates=     
['Date_Time'])
df= pd.DataFrame(visits)

这是数据的外观:

print(df.head(n=1))
Date_Time       IPAddress  Visitors      OS        Browser  \
0 2016-10-18 12:57:45  104.236.233.18      1001  Mac OS  Google Chrome   
Browser_Version Location                     Referrer     PageID  
0    39.0.2171.95      NaN  http://www.puneetmathur.in/  index.php  

问题在于 Date_Time 列:

import datetime
df['new_date'] = [d.date() for d in df['Date_Time']]
df['new_time'] = [d.time() for d in df['Date_Time']]
df['year'] = pd.DatetimeIndex(df['new_date']).year
df['month'] = pd.DatetimeIndex(df['new_date']).month

目的是根据月份获得从 1 到 30 或 31 或 28 的所有天数 = 12。

下面转换为String并拆分值以访问拆分后的DAY值:

strdt=str(df.new_date)
df['new_date']=df['new_date'].astype(str)
df['new_date']=df.new_date.apply(str)
type(df.new_date)
df['new_day']=df.new_date.str.split('-')

Pandas Dataframe 有超过 1000 行,所以这不是问题:

print(df.new_day)
print(df.new_day)
0       [2016, 10, 18]
1       [2016, 10, 18]
2       [2016, 10, 18]
3       [2016, 10, 18]
4       [2016, 10, 18]
5       [2016, 10, 18]
6       [2016, 10, 19]
7       [2016, 10, 19]
8       [2016, 10, 19]
9       [2016, 10, 19]
10      [2016, 10, 19]
11      [2016, 10, 19]
12      [2016, 10, 19]
13      [2016, 10, 19]
14      [2016, 10, 19]
15      [2016, 10, 19]
16      [2016, 10, 19]
17      [2016, 10, 19]
18      [2016, 10, 20]
19      [2016, 10, 20]
20      [2016, 10, 20]

我想访问第二个逗号两位数之后的第三个值 打印(df['new_day'][6][2]) 19

到目前为止一切顺利..

我现在先用月份过滤日期,然后尝试使用以下代码访问第二个逗号后的值:2 位数的值:

value_list = [12]
vdf= pd.DataFrame(df[df.month.isin(value_list)])
print(vdf[:][:].head(n=1))
print(vdf[:][:].head(n=1))
Date_Time     IPAddress  Visitors          OS       Browser  \
2836 2016-12-11 01:25:25  66.102.8.217      3955  Search Bot  Apple Safari   
Browser_Version                Location                     Referrer  \
2836               9  Florida, United States  http://www.puneetmathur.in/   

PageID    new_date  new_time  year  month         new_day  
2836  index.php  2016-12-11  01:25:25  2016     12  [2016, 12, 11]  

当我尝试访问第二个值时,它会给出奇怪的输出:

vdf['new_day'][:][:2].str.split('-')
Out[250]: Series([], Name: new_day, dtype: object)

以下内容也无法在第二个逗号之后给我 new_day 的第三列中的所有值。 请告诉我如何访问 new_day 的第 3 列中的 DAY 值

vdf.iloc[:,:]

【问题讨论】:

这太长了!这里的基本建议:只需将一列存储为 pandas 日期时间。使用 dt 访问器访问值(请参阅此处的文档:pandas.pydata.org/pandas-docs/stable/basics.html#dt-accessor)对于 pandas,将列表存储在列中通常是个坏主意。如果您有一个长度为 3 的列表的单列,您会发现最好将其存储为 3 个单独的列,每列中有一个值(或者在这里更好,只需存储为 dtype datetime 的单列然后使用 dt 访问器) 不知道为什么你在read_csv 中传递parse_dates,然后你通过尝试转换回字符串来扭转所有的好工作。基本上,一旦你完成了解析,你就可以使用.dt 访问日期时间属性,因此日将是df['Date_Time'].dt.day,月是...dt.month,同样是年。如果您只想要日期,那么您也可以使用dt.date,但这会为您提供一个datetime.date 对象,它比字符串有用但更有用 嘿 @EdChum 你的建议 df['Date_Time'].dt.day 工作得非常好,下面的工作也很好:df['Date_Time'].dt.day df['Date_Time']。 dt.month df['Date_Time'].dt.year df['Date_Time'].dt.date df['Date_Time'].dt.time df['Date_Time'].dt.hour df['Date_Time']。 dt.minute df['Date_Time'].dt.second 再次感谢 EdChum 我接受这个作为答案 关于如何选择 Month==12 的任何想法 @EdChum 以下代码给出错误:df['Date_Time'].dt.month=='12' TypeError: invalid type comparison 【参考方案1】:

这个问题非常令人困惑,但我认为您想按月份过滤 == 12。

如果您想每个月做一些事情,例如计数或获取唯一值,您可以使用 groupby

import pandas as pd
import numpy as np
import io

temp=u'''Date_Time,IPAddress,Visitors,OS,Browser
2016-10-18 12:57:45,104.236.233.1,1001,Mac OS1,Google Chrome
2016-10-17 12:57:45,104.236.233.2,1002,Mac OS2,Google Chrome
2016-11-16 12:57:45,104.236.233.3,1003,Mac OS3,Google Chrome
2016-11-15 12:57:45,104.236.233.3,1004,Mac OS4,Google Chrome
2016-12-16 12:57:45,104.236.233.5,1005,Mac OS5,Google Chrome
2016-12-15 12:57:45,104.236.233.6,1006,Mac OS6,Google Chrome
'''
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), parse_dates=['Date_Time'])

# Filter month equal 12
df[df['Date_Time'].dt.month == 12]

            #~ Date_Time      IPAddress  Visitors       OS        Browser
#~ 4 2016-12-16 12:57:45  104.236.233.5      1005  Mac OS5  Google Chrome
#~ 5 2016-12-15 12:57:45  104.236.233.6      1006  Mac OS6  Google Chrome

# Groupby month
gb = df.groupby(df['Date_Time'].dt.month)

# Count by month
gb.count()

 #~ Date_Time  IPAddress  Visitors  OS  Browser
#~ Date_Time                                             
#~ 10                 2          2         2   2        2
#~ 11                 2          2         2   2        2
#~ 12                 2          2         2   2        2


# Unique ip by month
gb.IPAddress.unique()

#~ Date_Time
#~ 10    [104.236.233.1, 104.236.233.2]
#~ 11                   [104.236.233.3]
#~ 12    [104.236.233.5, 104.236.233.6]
#~ Name: IPAddress, dtype: object

【讨论】:

问题不想 groupby() 我已经完成了我想访问 df['Date_Time'].dt.day 以访问日期时间内的日期,这是解决这个问题。【参考方案2】:
df['Date_Time'].dt.day 

我接受来自@edchums 的回答,他们不厌其烦地运行查询并解释如何从 python 中的简单日期时间列中提取日期和其他此类项目。

一个很好的答案值得起立鼓掌!

【讨论】:

【参考方案3】:

我遇到了同样的问题,用下面的代码解决了:

df['Date_Time'].dt.day 

试试吧,它应该适合你。 美妙的部分是,即使在导入时,您也已经完成了日期时间的转换。 现在您只需要使用 dt.day 访问当天即可。

【讨论】:

感谢希拉里,非常感谢这对我有用。

以上是关于熊猫从python中的日期字符串列获取日期值的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫框架中的一系列数据中找出值和日期

日期时间字符串到纪元:熊猫数据框

将具有日期和纪元格式值的字符串列转换为 postgresql/Tableau prep 中的日期列

从python中的第周、月和日获取日期

将字符串日期时间转换为熊猫日期时间

日期时间和熊猫之间的 Unix 纪元值不匹配