คุณสามารถใช้ฟังก์ชันtz_localize
เพื่อทำให้ Timestamp หรือ DateTimeIndex ทราบเขตเวลา แต่คุณจะทำสิ่งที่ตรงกันข้ามได้อย่างไร: คุณจะแปลง Timestamp ที่รับรู้เขตเวลาเป็นแบบไร้เดียงสาได้อย่างไรในขณะที่รักษาเขตเวลาไว้
ตัวอย่าง:
In [82]: t = pd.date_range(start="2013-05-18 12:00:00", periods=10, freq='s', tz="Europe/Brussels")
In [83]: t
Out[83]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: S, Timezone: Europe/Brussels
ฉันสามารถลบเขตเวลาได้โดยตั้งค่าเป็นไม่มี แต่ผลลัพธ์จะถูกแปลงเป็น UTC (12 นาฬิกากลายเป็น 10):
In [86]: t.tz = None
In [87]: t
Out[87]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 10:00:00, ..., 2013-05-18 10:00:09]
Length: 10, Freq: S, Timezone: None
มีวิธีอื่นที่ฉันสามารถแปลง DateTimeIndex เป็นเขตเวลาแบบไร้เดียงสา แต่ในขณะที่รักษาเขตเวลาที่ตั้งค่าไว้
บริบทบางอย่างเกี่ยวกับเหตุผลที่ฉันถามสิ่งนี้: ฉันต้องการทำงานกับไทม์โซนที่ไร้เดียงสา (เพื่อหลีกเลี่ยงความยุ่งยากกับเขตเวลาเพิ่มเติมและฉันไม่ต้องการมันสำหรับกรณีที่ฉันกำลังดำเนินการอยู่)
แต่ด้วยเหตุผลบางประการฉันต้องจัดการกับเขตเวลาที่ทราบเขตเวลาในเขตเวลาท้องถิ่นของฉัน (ยุโรป / บรัสเซลส์) เนื่องจากข้อมูลอื่น ๆ ของฉันเป็นเขตเวลาที่ไร้เดียงสา (แต่แสดงในเขตเวลาท้องถิ่นของฉัน) ฉันจึงต้องการแปลงช่วงเวลานี้ให้ไร้เดียงสาเพื่อใช้งานได้ต่อไป แต่ก็ต้องแสดงในเขตเวลาท้องถิ่นของฉันด้วย (ดังนั้นเพียงแค่ลบข้อมูลเขตเวลาออก โดยไม่ต้องแปลงเวลาที่ผู้ใช้มองเห็นเป็น UTC)
ฉันรู้ว่าเวลานั้นถูกจัดเก็บไว้ภายในเป็น UTC และจะแปลงเป็นเขตเวลาอื่นเมื่อคุณเป็นตัวแทนเท่านั้นดังนั้นจึงต้องมีการแปลงบางประเภทเมื่อฉันต้องการ "delocalize" ตัวอย่างเช่นด้วยโมดูล python datetime คุณสามารถ "ลบ" เขตเวลาได้ดังนี้:
In [119]: d = pd.Timestamp("2013-05-18 12:00:00", tz="Europe/Brussels")
In [120]: d
Out[120]: <Timestamp: 2013-05-18 12:00:00+0200 CEST, tz=Europe/Brussels>
In [121]: d.replace(tzinfo=None)
Out[121]: <Timestamp: 2013-05-18 12:00:00>
จากสิ่งนี้ฉันสามารถทำสิ่งต่อไปนี้ได้ แต่ฉันคิดว่าสิ่งนี้จะไม่มีประสิทธิภาพมากนักเมื่อทำงานกับไทม์ซีรีส์ที่ใหญ่กว่า
In [124]: t
Out[124]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: S, Timezone: Europe/Brussels
In [125]: pd.DatetimeIndex([i.replace(tzinfo=None) for i in t])
Out[125]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: None, Timezone: None