Nyx*_*nyx 26 python numpy scipy python-2.7 pandas
我有一个DataFrame名为列的列date.我们如何将'date'列转换/解析为DateTime对象?
我使用Postgresql数据库加载了日期列sql.read_frame().该date列的一个例子是2013-04-04.
我想要做的是选择数据框中的所有行,这些行的日期列在特定时间段内,如2013-04-01之前和之后2013-04-04.
我在下面的尝试给出了错误 'Series' object has no attribute 'read'
尝试
import dateutil
df['date'] = dateutil.parser.parse(df['date'])
Run Code Online (Sandbox Code Playgroud)
错误
AttributeError Traceback (most recent call last)
<ipython-input-636-9b19aa5f989c> in <module>()
15
16 # Parse 'Date' Column to Datetime
---> 17 df['date'] = dateutil.parser.parse(df['date'])
18
19 # SELECT RECENT SALES
C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(timestr, parserinfo, **kwargs)
695 return parser(parserinfo).parse(timestr, **kwargs)
696 else:
--> 697 return DEFAULTPARSER.parse(timestr, **kwargs)
698
699
C:\Python27\lib\site-packages\dateutil\parser.pyc in parse(self, timestr, default, ignoretz, tzinfos, **kwargs)
299 default = datetime.datetime.now().replace(hour=0, minute=0,
300 second=0, microsecond=0)
--> 301 res = self._parse(timestr, **kwargs)
302 if res is None:
303 raise ValueError, "unknown string format"
C:\Python27\lib\site-packages\dateutil\parser.pyc in _parse(self, timestr, dayfirst, yearfirst, fuzzy)
347 yearfirst = info.yearfirst
348 res = self._result()
--> 349 l = _timelex.split(timestr)
350 try:
351
C:\Python27\lib\site-packages\dateutil\parser.pyc in split(cls, s)
141
142 def split(cls, s):
--> 143 return list(cls(s))
144 split = classmethod(split)
145
C:\Python27\lib\site-packages\dateutil\parser.pyc in next(self)
135
136 def next(self):
--> 137 token = self.get_token()
138 if token is None:
139 raise StopIteration
C:\Python27\lib\site-packages\dateutil\parser.pyc in get_token(self)
66 nextchar = self.charstack.pop(0)
67 else:
---> 68 nextchar = self.instream.read(1)
69 while nextchar == '\x00':
70 nextchar = self.instream.read(1)
AttributeError: 'Series' object has no attribute 'read'
Run Code Online (Sandbox Code Playgroud)
df['date'].apply(dateutil.parser.parse) 给了我错误 AttributeError: 'datetime.date' object has no attribute 'read'
df['date'].truncate(after='2013/04/01') 给出了错误 TypeError: can't compare datetime.datetime to long
df['date'].dtype回报dtype('O').它已经是一个datetime对象吗?
Kei*_*ith 53
Pandas知道对象的日期时间,但是当你使用一些导入函数时,它被视为一个字符串.所以你需要做的是确保将列设置为日期时间类型而不是字符串.然后你可以进行查询.
df['date'] = pd.to_datetime(df['date'])
df_masked = df[(df['date'] > datetime.date(2012,4,1)) & (df['date'] < datetime.date(2012,4,4))]
Run Code Online (Sandbox Code Playgroud)
您可能需要apply,所以类似:
df['date'] = df['date'].apply(dateutil.parser.parse)
Run Code Online (Sandbox Code Playgroud)
如果没有本专栏的示例,我无法保证这会奏效,但是朝着这个方向的一些建议应该可以帮助您继续。
熊猫已经把它作为一个datetime对象读取!所以你想要的是选择两个日期之间的行,你可以通过屏蔽来实现:
df_masked = df[(df.date > '2012-04-01') & (df.date < '2012-04-04')]
Run Code Online (Sandbox Code Playgroud)
因为你说由于某种原因你从字符串中得到错误,试试这个:
df_masked = df[(df.date > datetime.date(2012,4,1)) & (df.date < datetime.date(2012,4,4))]
Run Code Online (Sandbox Code Playgroud)
datetime.date与熊猫混淆pd.Timestamp“熊猫datetime系列”包含pd.Timestamp元素,而不是 datetime.date元素。推荐的 Pandas 解决方案:
s = pd.to_datetime(s) # convert series to Pandas
mask = s > '2018-03-10' # calculate Boolean mask against Pandas-compatible object
Run Code Online (Sandbox Code Playgroud)
顶级答案有问题:
TypeError.任何好的 Pandas 解决方案都必须确保:
datetime系列,而不是objectdtype。datetime系列与兼容对象(例如pd.Timestamp,或正确格式的字符串)进行比较。这是一个带有基准测试的演示,演示了一次性的转换成本可以通过单个操作立即抵消:
from datetime import date
L = [date(2018, 1, 10), date(2018, 5, 20), date(2018, 10, 30), date(2018, 11, 11)]
s = pd.Series(L*10**5)
a = s > date(2018, 3, 10) # accepted solution #2, inefficient
b = pd.to_datetime(s) > '2018-03-10' # more efficient, including datetime conversion
assert a.equals(b) # check solutions give same result
%timeit s > date(2018, 3, 10) # 40.5 ms
%timeit pd.to_datetime(s) > '2018-03-10' # 33.7 ms
s = pd.to_datetime(s)
%timeit s > '2018-03-10' # 2.85 ms
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50993 次 |
| 最近记录: |