【问题标题】:Convert pandas series cell to string and datetime object将熊猫系列单元格转换为字符串和日期时间对象
【发布时间】:2017-09-22 08:34:36
【问题描述】:

我已经对 pandas 数据框进行了切片。

end_date = df[-1:]['end'] 

type(end_date) 
Out[4]: pandas.core.series.Series 

end_date 
Out[3]: 
48173   2017-09-20 04:47:59 
Name: end, dtype: datetime64[ns] 
  1. 如何去掉end_date的索引值48173,只得到2017-09-20 04:47:59字符串?我必须以2017-09-20 04:47:59 作为参数调用REST API,所以我必须从pandas datetime64 系列中获取字符串。
  2. 如何摆脱 end_date 的索引值48173 并仅获取日期时间对象 [类似于datetime.datetime.strptime('2017-09-20 04:47:59', '%Y-%m-%d %H:%M:%S')]。我需要它,因为稍后我将不得不检查'2017-09-20 04:47:59' < datetime.datetime(2017,1,9)

我只需要转换一个单元格值,而不是一整列。 如何进行这些转换?

【问题讨论】:

  • 由于不清楚,请将您的代码与解释器中的执行分开。
  • df[-1:]['a'].item()df[-1:]['a'].values[0]?
  • 这行得通。谢谢。
  • 我很困惑。 import pandas as pd df = pd.DataFrame(pd.date_range('2017-01-01', periods=5, freq='T'), columns=['end']) df[-1:]['end'] 4 2017-01-01 00:04:00 Name: end, dtype: datetime64[ns] df['end'].iloc[-1] Timestamp('2017-01-01 00:04:00')最后一行之前的行返回index和datetime64,但最后一行返回Timestamp。

标签: python pandas type-conversion datetime64


【解决方案1】:

看来你需要:

import pandas as pd
data = ['2017-09-20 04:47:59','2017-10-20 04:47:59','2017-09-30 04:47:59']
df = pd.DataFrame(data,columns=['end'])
df['end'] = pd.to_datetime(df['end'])
df

df 将是:

    end
0   2017-09-20 04:47:59
1   2017-10-20 04:47:59
2   2017-09-30 04:47:59

之后,您可以使用以下代码摆脱索引并用作“时间戳”对象:

end_date = df['end'].iloc[-1] #get last row of column end
print(type(end_date)) # pandas.tslib.Timestamp
end_date_str = end_date.strftime('%Y-%m-%d %H:%M:%S') #convert to str
print(end_date_str) # '2017-09-30 04:47:59'
print(end_date < datetime.datetime(2017,1,9)) #False

【讨论】:

  • @user3225309 很高兴它有帮助,如果它是正确的解决方案,请标记为接受答案:)
【解决方案2】:

只需将结果转换为字符串,然后使用.values[0] 恢复它:

In [38]: end_date
Out[38]:
48173   2017-09-20 04:47:59
Name: end, dtype: datetime64[ns]

In [39]: end_date.astype(str).values[0]
Out[39]: '2017-09-20 04:47:59'

如果你想要一个 datetime 对象,你必须将它转换为时间戳,然后再转换回 datetime 对象:

In [42]: end_date.values[0].item()
Out[42]: 1505882879000000000

In [43]: datetime.fromtimestamp(end_date.values[0].item()/10**9)
Out[43]: datetime.datetime(2017, 9, 20, 6, 47, 59)

否则你可以strptime第1步恢复的字符串:

In [48]: datetime.datetime.strptime(end_date.astype(str).values[0], '%Y-%m-%d %H:%M:%S')
Out[48]: datetime.datetime(2017, 9, 20, 4, 47, 59)

您可能想知道为什么结果之间存在 2 小时差异。这是因为datetime.datetime.fromtimestamp 考虑了我的时区(当前为 CEST,即 UTC+2)。 另一方面,将字符串解析为 datetime 对象不会产生任何时区信息,srtptime 天真地解析时间戳而不考虑时区,这会导致 2 小时的差异。

【讨论】:

  • end_date.astype(str).values[0] 有效。谢谢。但是 np.datetime64(datetime.datetime.utcnow()).astype(datetime) Traceback(最近一次调用最后一次): File "C:\Users\...\AppData\Local\Programs\Python\Python35\lib\site -packages\IPython\core\interactiveshell.py”,第 2881 行,在 run_code exec(code_obj, self.user_global_ns, self.user_ns) 文件“”中,第 1 行,在 np .datetime64(datetime.datetime.utcnow()).astype(datetime) TypeError: 数据类型不理解
  • datetime.datetime.strptime(end_date.astype(str).values[0], '%Y-%m-%d %H:%M:%S') 也可以。
  • @user3225309 您在第一条评论中想要达到什么目的?直接转换为日期时间?你不能直接通过pandas进行投射,abd必须参考我链接的答案。此外,如果它解决了您的问题,请随时“接受答案”
  • 在您提供的链接上,我发现以下内容:np.datetime64(datetime.datetime.utcnow()).astype(datetime) 在我的情况下不起作用。
  • @user3225309 抱歉,我没有注意到您使用的是datetime64[ns] 而不是datetime64。我更新了我的答案以匹配它。
猜你喜欢
  • 2019-03-24
  • 2017-05-20
  • 2016-10-21
  • 2021-07-28
  • 2016-03-24
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
相关资源
最近更新 更多