การแปลง pandas.tslib.Timestamp เป็น datetime python

ฉันมีอนุกรมเวลา df ฉันแยกดัชนีแล้วและต้องการแปลงแต่ละรายการเป็น datetime คุณจะทำอย่างนั้นได้อย่างไร? ฉันพยายามใช้ pandas.to_datetime(x) แต่มันไม่แปลงเมื่อฉันตรวจสอบหลังจากใช้ type()


person user1234440    schedule 15.09.2014    source แหล่งที่มา
comment
คุณช่วยโพสต์โค้ดตัวอย่างได้ไหม   -  person Ffisegydd    schedule 15.09.2014
comment
แพนด้า pydata.org/pandas-docs/stable/generated/   -  person Jeff    schedule 15.09.2014


คำตอบ (9)


เพียงลอง to_pydatetime ()

>>> import pandas as pd
>>> t = pd.tslib.Timestamp('2016-03-03 00:00:00')
>>> type(t)
pandas.tslib.Timestamp
>>> t.to_pydatetime()
datetime.datetime(2016, 3, 3, 0, 0)

เปลี่ยนเป็นประเภท datetime.date

>>> t.date()
datetime.date(2016, 3, 3)
person GoingMyWay    schedule 12.03.2016
comment
ตามหมายเหตุ: pd.to_datetime() เสื่อมค่าแล้ว pd.to_pydatetime() คือมาตรฐานใหม่ - person mjp; 27.07.2017

ฉันมีปัญหาเดียวกัน และลองวิธีแก้ปัญหาจาก @ aikramer2 เพื่อเพิ่มคอลัมน์ใน df ประเภท 'datetime.datetime' ของฉัน แต่ฉันได้รับประเภทข้อมูล pandas อีกครั้ง:

#libraries used -
import pandas as pd
import datetime as dt

#loading data into a pandas df, from a local file. note column [1] contains a datetime column -
savedtweets = pd.read_csv('/Users/sharon/Documents/ipython/twitter_analysis/conftwit.csv', sep='\t', 
                      names=['id', 'created_at_string', 'user.screen_name', 'text'], 
                      parse_dates={"created_at" : [1]})
print int(max(savedtweets['id'])) #535073416026816512
print type(savedtweets['created_at'][0]) # result is <class 'pandas.tslib.Timestamp'>

# add a column specifically using datetime.datetime library -
savedtweets['datetime'] = savedtweets['created_at'].apply(lambda x: dt.datetime(x.year,x.month,x.day))
print type(savedtweets['datetime'][0]) # result is <class 'pandas.tslib.Timestamp'>

ฉันสงสัยว่า pandas df ไม่สามารถจัดเก็บประเภทข้อมูล datetime.datetime ได้ ฉันประสบความสำเร็จเมื่อฉันสร้างรายการหลามธรรมดาเพื่อจัดเก็บค่า datetime.datetime:

savedtweets = pd.read_csv('/Users/swragg/Documents/ipython/twitter_analysis/conftwit.csv', sep='\t', 
                      names=['id', 'created_at_string', 'user.screen_name', 'text'], 
                      parse_dates={"created_at" : [1]})
print int(max(savedtweets['id'])) #535073416026816512
print type(savedtweets['created_at'][0]) # <class 'pandas.tslib.Timestamp'>
savedtweets_datetime= [dt.datetime(x.year,x.month,x.day,x.hour,x.minute,x.second) for x in savedtweets['created_at']]
print savedtweets_datetime[0] # 2014-11-19 14:13:38
print savedtweets['created_at'][0] # 2014-11-19 14:13:38
print type(dt.datetime(2014,3,5,2,4)) # <type 'datetime.datetime'>
print type(savedtweets['created_at'][0].year) # <type 'int'>
print type(savedtweets_datetime) # <type 'list'>
person sharon    schedule 20.11.2014
comment
นี่คือวิธีแก้ปัญหาสำหรับฉัน งานดี. - person kwant; 05.07.2017

เพียงอัปเดตคำถาม ฉันได้ลองคำตอบที่ได้รับการโหวตมากที่สุดแล้ว และมันทำให้ฉันมีคำเตือนนี้

usr/local/lib/python3.5/dist-packages/IPython/core/interactiveshell.py:2910: FutureWarning: to_datetime เลิกใช้แล้ว ใช้ self.to_pydatetime() exec(code_obj, self.user_global_ns, self.user_ns)

และแนะนำให้ฉันใช้ to_pydatetime()

ตัวอย่างเช่น

sample = Timestamp('2018-05-02 10:08:54.774000')

sample.to_datetime() จะกลับมา datetime.datetime(2018, 4, 30, 10, 8, 54, 774000)

person Morris wong    schedule 02.05.2018
comment
ขอบคุณสำหรับการเตรียมตัวให้ดี มอร์ริส ดูเหมือนว่าจะเป็นคำเตือน ไม่ใช่ข้อผิดพลาด เว้นแต่ว่าโค้ดจะหยุดทำงาน - person LShapz; 02.05.2018

สมมติว่าคุณกำลังพยายามแปลงวัตถุการประทับเวลาของ pandas คุณสามารถดึงข้อมูลที่เกี่ยวข้องจากการประทับเวลาได้:

#Create the data
data = {1: tslib.Timestamp('2013-01-03 00:00:00', tz=None), 2: tslib.Timestamp('2013-01-04 00:00:00', tz=None), 3: tslib.Timestamp('2013-01-03 00:00:00', tz=None)}

#convert to df
df = pandas.DataFrame.from_dict(data, orient = 'index')
df.columns = ['timestamp']

#generate the datetime
df['datetime'] = df['timestamp'].apply(lambda x: datetime.date(x.year,x.month,x.day))

แน่นอน หากคุณต้องการวินาที นาที และชั่วโมง คุณสามารถรวมสิ่งเหล่านั้นเป็นอาร์กิวเมนต์สำหรับฟังก์ชัน datetime.datetime ได้เช่นกัน

person aikramer2    schedule 13.11.2014
comment
นี่ดูเหมือนจะเป็นเพียงวิธีแก้ปัญหา ดูคำตอบของ @alexander-yau สำหรับวิธีแก้ปัญหาที่แท้จริง - person eviltnan; 13.07.2016

import time
time.strftime("%H:%M",  time.strptime(str(x), "%Y-%m-%d %H:%M:%S"))

หมายเหตุ: x ควรเป็น pandas.tslib.Timestamp (ตามที่อยู่ในคำถาม)

person Kostyantyn    schedule 30.03.2015

สิ่งนี้ใช้ได้กับฉัน หากต้องการสร้างวันที่สำหรับ insert ใน MySQL โปรดลอง:

pandas_tslib = pandas_tslib.to_pydatetime()
pandas_tslib = "'" + pandas_tslib.strftime('%Y-%m-%d') + "'"
person giovannivl    schedule 27.04.2017

ทางเลือกอื่นหากคุณมี สองช่องแยกกัน (หนึ่งช่องสำหรับวันที่ และอีกหนึ่งช่องสำหรับเวลา):

แปลงเป็น datetime.date

df['date2'] = pd.to_datetime(df['date']).apply(lambda x: x.date())

แปลงเป็น datetime.time

df['time2'] = pd.to_datetime(df['time']).apply(lambda x: x.time())

หลังจากนั้น คุณสามารถ รวมเข้าด้วยกัน:

df['datetime'] = df.apply(lambda r : pd.datetime.combine(r['date2'],r['time2']),1)

ดัดแปลงโพสต์นี้

person gies0r    schedule 01.01.2019

คุณสามารถแปลงการประทับเวลาเป็นวัตถุวันที่เวลาของ Python ด้วย to_pydatetime() แต่ดูเหมือนว่าเมื่อใช้กับทั้งคอลัมน์การแปลงนั้นจะถูกขัดขวาง:

>>> ts = pd.tslib.Timestamp.now()
>>> type(ts)
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
>>> type(ts.to_pydatetime())
<class 'datetime.datetime'>
>>> df = pd.DataFrame({"now": [datetime.datetime.utcnow()] * 10})
>>> type(df['now'].iloc[0])
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
>>> df['now2'] = df['now'].apply(lambda dt: dt.to_pydatetime())
>>> type(df['now2'].iloc[0])
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

ไม่แน่ใจว่าจะทำอย่างไร (มีบางสถานการณ์ที่วัตถุ Timestamp ของ Pandas ไม่สามารถทดแทนวัตถุ datetime ของ Python ได้อย่างสมบูรณ์แบบ และคุณต้องการของจริง)

person smontanaro    schedule 19.07.2018

ในกรณีของฉัน ฉันไม่สามารถได้ผลลัพธ์ที่ถูกต้องแม้ว่าจะระบุรูปแบบ: ฉันเคยใช้ปี 1970 เสมอ

จริงๆ แล้วสิ่งที่แก้ไขปัญหาของฉันได้คือการระบุพารามิเตอร์ unit ให้กับฟังก์ชันเนื่องจากการประทับเวลาของฉันมีรายละเอียดเป็นวินาที:

df_new = df
df_new['time'] = pandas.to_datetime(df['time'], unit='s')
person Francesco Boi    schedule 22.01.2019