我是python的新手,曾经使用过R。
通常,我创建timedelta的数值向量并建立箱形图。在python中似乎有点复杂。 这是我得到的清单的一部分。
1502 4 days 17:51:16
1503 4 days 17:51:57
1504 4 days 17:48:24
1505 4 days 17:34:16
1506 4 days 17:32:58
1507 4 days 19:21:27
1508 4 days 19:52:43
1509 4 days 19:37:17
1510 4 days 21:00:30
1511 5 days 00:56:52
1512 3 days 00:56:04
1513 NaT
Length: 1514, dtype: timedelta64[ns]
我在列表上试过了
# Create a figure instance
fig = plt.figure(1, figsize=(9, 6))
# Create an axes instance
ax = fig.add_subplot(111)
# Create the boxplot
bp = ax.boxplot(timediff)
# Save the figure
fig.savefig('fig1.png', bbox_inches='tight')
我确实得到了输出,但这似乎是完全错误的。有人能帮我吗?数据类型有误吗?
答案 0 :(得分:1)
当前,您的箱线图使用Unix时间(自时期1970-01-01 00:00:00
起经过的秒数)代表您的时间差timedelta64[ns]
的值。因此,y轴的单位非常大:1e19
。
请考虑以您需要的单位转换时差值:带小数点的天。然后绘制系列。
timediff = timediff_raw.dt.days + \
(timediff_raw.dt.seconds//3600) / 24 + \
((timediff_raw.dt.seconds//60)%60) / (24*60)
print(timediff.head(10))
注意:非常低的离群值将保持不变,因为相同的图形将渲染,但y轴单位不同。
以可重现的随机种子示例进行演示:
数据 (一系列50个元素)
import numpy as np
import pandas as pd
import datetime as dt
import time
import matplotlib.pyplot as plt
# CURRENT TIME STAMP
epoch_time = int(time.time())
np.random.seed(81618)
time1 = pd.Series([dt.datetime.fromtimestamp(np.random.randint(1530000000, epoch_time))
for _ in range(50)])
time2 = pd.Series([dt.datetime.fromtimestamp(np.random.randint(1530000000, epoch_time))
for _ in range(50)])
print(time1.head())
# 0 2018-07-29 04:12:07
# 1 2018-07-02 07:48:08
# 2 2018-08-17 05:04:59
# 3 2018-08-06 21:37:45
# 4 2018-07-15 10:27:10
# dtype: datetime64[ns]
print(time2.head())
# 0 2018-07-25 09:11:39
# 1 2018-08-15 07:05:39
# 2 2018-07-06 08:19:05
# 3 2018-07-13 19:08:30
# 4 2018-07-24 11:13:06
# dtype: datetime64[ns]
时差转换 (使用pandas.Series.dt)
timediff_raw = (time1 - time2)
timediff = timediff_raw.dt.days + \
(timediff_raw.dt.seconds / (60*60*24)) # NUMBER OF SECONDS IN A DAY
print(timediff.head(10))
# 0 3.791991
# 1 -43.970498
# 2 41.865208
# 3 24.103646
# 4 -9.031898
# dtype: float64
图
# Create a figure instance
fig = plt.figure(figsize=(9, 6))
# Create an axes instance
ax = fig.add_subplot(111)
# Create the boxplot
ax.boxplot(timediff)
plt.xlabel('Single Series')
plt.ylabel('Time Difference (Days)')
plt.show()
plt.clf()
plt.close('all')