如何将带有日期时间的数据帧从 Stack Overflow 复制到 Python?
How can I copy DataFrames with datetimes from Stack Overflow into Python?
我在 SO 上经常看到 pandas
使用在时间戳中有 空格的时间序列的例子:
A
2020-01-01 09:20:00 0
2020-01-01 09:21:00 1
2020-01-01 09:22:00 2
2020-01-01 09:23:00 3
2020-01-01 09:24:00 4
或者这个时间不是索引的一部分:
dates values cat
0 2020-01-01 09:20:00 0.758513 a
1 2020-01-01 09:21:00 0.337325 b
2 2020-01-01 09:22:00 0.618372 b
3 2020-01-01 09:23:00 0.878714 b
4 2020-01-01 09:24:00 0.311069 b
是否有将这些(或类似)数据复制回 Python 以供使用的好方法? 我发现 post 像 and this 这是从 SO 中获取许多示例的救命稻草,但我通常找不到适用于此类数据的 copy/paste 方法(使用 pd.read_clipboard()
或 pd.read_table()
)。这通常会阻止我尝试回答1.
上面的例子是这样创建的:
#one
import pandas as pd
import numpy
dr = pd.date_range('01-01-2020 9:20', '01-01-2020 9:24', freq='1T')
df1 = pd.DataFrame(index=dr, data=range(len(dr)), columns=['A'])
#two
df2 = pd.DataFrame({'dates':dr,
'values':np.random.rand(len(dr)),
'cat':np.random.choice(['a','b'],len(dr))})
1.郑重声明,我认为 post 用户有责任以更易于复制的格式 post 他们的数据,否则得不到答复。对于时间序列信息,我总是尝试 post 构造代码 (使用 pd.date_range()
或 w/e),而不是粘贴 DataFrame 的字符串表示形式。我想如果示例需要复制特定的(不规则间隔)日期,那么使用 df.to_dict()
之类的东西会更好。
我通常复制整个字符串然后解析它。它并不完美,您通常必须同时编辑字符串和数据框才能使其可用。这是一个例子。此解决方案已在 中提供。我只添加了有关解析 date/time.
的内容
import pandas as pd
from io import StringIO
from dateutil.parser import parse
# I added two more column names `date` and `time`.
# An advantage of having the string in your python code is that
# you can edit it in your text editor/jupyter notebook quickly and directly.
s = """date time A
2020-01-01 09:20:00 0
2020-01-01 09:21:00 1
2020-01-01 09:22:00 2
2020-01-01 09:23:00 3
2020-01-01 09:24:00 4"""
# Parse using whitespace separator. This will still not be perfect as we can
# see below.
df = pd.read_csv(StringIO(s), sep="\s+", index_col=False)
df
# date time A
# 0 2020-01-01 09:20:00 0
# 1 2020-01-01 09:21:00 1
# 2 2020-01-01 09:22:00 2
# 3 2020-01-01 09:23:00 3
# 4 2020-01-01 09:24:00 4
# Combine date and time column together and drop the individual columns.
df['datetime'] = df['date'] + " " + df['time']
df = df.drop(['date', 'time'], axis=1)
# Use a somewhat universal parser in dateutil.parser.parse to parse the
# dates into proper dateime object.
df['datetime'] = df['datetime'].apply(parse)
df
# A datetime
# 0 0 2020-01-01 09:20:00
# 1 1 2020-01-01 09:21:00
# 2 2 2020-01-01 09:22:00
# 3 3 2020-01-01 09:23:00
# 4 4 2020-01-01 09:24:00
df.index
# RangeIndex(start=0, stop=5, step=1)
df.dtypes
# A int64
# datetime datetime64[ns]
# dtype: object
df.columns
# Index(['A', 'datetime'], dtype='object')
在 Whosebug 上提供格式化和可解析数据帧的一种方法是输出 csv 格式的字符串。
# Continued from above
print(df.to_csv(index=False))
# A,datetime
# 0,2020-01-01 09:20:00
# 1,2020-01-01 09:21:00
# 2,2020-01-01 09:22:00
# 3,2020-01-01 09:23:00
# 4,2020-01-01 09:24:00
# We can indeed parse nicely from the csv-formatted string
s_redux = df.to_csv(index=False)
pd.read_csv(StringIO(s_redux))
# A datetime
# 0 0 2020-01-01 09:20:00
# 1 1 2020-01-01 09:21:00
# 2 2 2020-01-01 09:22:00
# 3 3 2020-01-01 09:23:00
# 4 4 2020-01-01 09:24:00
这是解析第二个示例数据帧的一次尝试。和以前一样,我们确实需要对数据框进行一些“编辑”以使其可用。
import pandas as pd
from io import StringIO
from dateutil.parser import parse
s=""" dates values cat
0 2020-01-01 09:20:00 0.758513 a
1 2020-01-01 09:21:00 0.337325 b
2 2020-01-01 09:22:00 0.618372 b
3 2020-01-01 09:23:00 0.878714 b
4 2020-01-01 09:24:00 0.311069 b"""
df = pd.read_csv(StringIO(s), sep="\s+").reset_index()
df
# level_0 level_1 dates values cat
# 0 0 2020-01-01 09:20:00 0.758513 a
# 1 1 2020-01-01 09:21:00 0.337325 b
# 2 2 2020-01-01 09:22:00 0.618372 b
# 3 3 2020-01-01 09:23:00 0.878714 b
# 4 4 2020-01-01 09:24:00 0.311069 b
df['dates'] = df['level_1'] + " " + df['dates']
df = df.drop(['level_0', 'level_1'], axis=1)
df['dates'] = df['dates'].apply(parse)
df
# dates values cat
# 0 2020-01-01 09:20:00 0.758513 a
# 1 2020-01-01 09:21:00 0.337325 b
# 2 2020-01-01 09:22:00 0.618372 b
# 3 2020-01-01 09:23:00 0.878714 b
# 4 2020-01-01 09:24:00 0.311069 b
df.dtypes
# dates datetime64[ns]
# values float64
# cat object
# dtype: object
我通常对 Pandas SO 问题所做的只是引用日期和时间值(在复制粘贴之后)。如果行数很多,我将使用文本编辑器执行 Find/Replace,通常在年份模式之前 (20XX
) 和日模式之后 (-01
) 添加引号。从那里,使用 StringIO
,指定 parse_dates
并根据需要在 read.csv
(或 read.table
)
中指定 index_col
参数
日期时间作为索引
from io import StringIO
import pandas as pd
txt = ''' A
"2020-01-01 09:20:00" 0
"2020-01-01 09:21:00" 1
"2020-01-01 09:22:00" 2
"2020-01-01 09:23:00" 3
"2020-01-01 09:24:00" 4'''
df = pd.read_csv(StringIO(txt), sep="\s+", parse_dates=True)
df.index
# DatetimeIndex(['2020-01-01 09:20:00', '2020-01-01 09:21:00',
# '2020-01-01 09:22:00', '2020-01-01 09:23:00',
# '2020-01-01 09:24:00'],
# dtype='datetime64[ns]', freq=None)
日期时间列
txt = ''' dates value cat
0 "2020-01-01 09:20:00" 0.758513 a
1 "2020-01-01 09:21:00" 0.337325 b
2 "2020-01-01 09:22:00" 0.618372 b
3 "2020-01-01 09:23:00" 0.878714 b
4 "2020-01-01 09:24:00" 0.311069 b'''
df = pd.read_csv(StringIO(txt), sep="\s+", index_col=[0], parse_dates=["dates"])
df.dtypes
# dates datetime64[ns]
# values float64
# cat object
# dtype: object
我在 SO 上经常看到 pandas
使用在时间戳中有 空格的时间序列的例子:
A
2020-01-01 09:20:00 0
2020-01-01 09:21:00 1
2020-01-01 09:22:00 2
2020-01-01 09:23:00 3
2020-01-01 09:24:00 4
或者这个时间不是索引的一部分:
dates values cat
0 2020-01-01 09:20:00 0.758513 a
1 2020-01-01 09:21:00 0.337325 b
2 2020-01-01 09:22:00 0.618372 b
3 2020-01-01 09:23:00 0.878714 b
4 2020-01-01 09:24:00 0.311069 b
是否有将这些(或类似)数据复制回 Python 以供使用的好方法? 我发现 post 像 pd.read_clipboard()
或 pd.read_table()
)。这通常会阻止我尝试回答1.
上面的例子是这样创建的:
#one
import pandas as pd
import numpy
dr = pd.date_range('01-01-2020 9:20', '01-01-2020 9:24', freq='1T')
df1 = pd.DataFrame(index=dr, data=range(len(dr)), columns=['A'])
#two
df2 = pd.DataFrame({'dates':dr,
'values':np.random.rand(len(dr)),
'cat':np.random.choice(['a','b'],len(dr))})
1.郑重声明,我认为 post 用户有责任以更易于复制的格式 post 他们的数据,否则得不到答复。对于时间序列信息,我总是尝试 post 构造代码 (使用 pd.date_range()
或 w/e),而不是粘贴 DataFrame 的字符串表示形式。我想如果示例需要复制特定的(不规则间隔)日期,那么使用 df.to_dict()
之类的东西会更好。
我通常复制整个字符串然后解析它。它并不完美,您通常必须同时编辑字符串和数据框才能使其可用。这是一个例子。此解决方案已在
import pandas as pd
from io import StringIO
from dateutil.parser import parse
# I added two more column names `date` and `time`.
# An advantage of having the string in your python code is that
# you can edit it in your text editor/jupyter notebook quickly and directly.
s = """date time A
2020-01-01 09:20:00 0
2020-01-01 09:21:00 1
2020-01-01 09:22:00 2
2020-01-01 09:23:00 3
2020-01-01 09:24:00 4"""
# Parse using whitespace separator. This will still not be perfect as we can
# see below.
df = pd.read_csv(StringIO(s), sep="\s+", index_col=False)
df
# date time A
# 0 2020-01-01 09:20:00 0
# 1 2020-01-01 09:21:00 1
# 2 2020-01-01 09:22:00 2
# 3 2020-01-01 09:23:00 3
# 4 2020-01-01 09:24:00 4
# Combine date and time column together and drop the individual columns.
df['datetime'] = df['date'] + " " + df['time']
df = df.drop(['date', 'time'], axis=1)
# Use a somewhat universal parser in dateutil.parser.parse to parse the
# dates into proper dateime object.
df['datetime'] = df['datetime'].apply(parse)
df
# A datetime
# 0 0 2020-01-01 09:20:00
# 1 1 2020-01-01 09:21:00
# 2 2 2020-01-01 09:22:00
# 3 3 2020-01-01 09:23:00
# 4 4 2020-01-01 09:24:00
df.index
# RangeIndex(start=0, stop=5, step=1)
df.dtypes
# A int64
# datetime datetime64[ns]
# dtype: object
df.columns
# Index(['A', 'datetime'], dtype='object')
在 Whosebug 上提供格式化和可解析数据帧的一种方法是输出 csv 格式的字符串。
# Continued from above
print(df.to_csv(index=False))
# A,datetime
# 0,2020-01-01 09:20:00
# 1,2020-01-01 09:21:00
# 2,2020-01-01 09:22:00
# 3,2020-01-01 09:23:00
# 4,2020-01-01 09:24:00
# We can indeed parse nicely from the csv-formatted string
s_redux = df.to_csv(index=False)
pd.read_csv(StringIO(s_redux))
# A datetime
# 0 0 2020-01-01 09:20:00
# 1 1 2020-01-01 09:21:00
# 2 2 2020-01-01 09:22:00
# 3 3 2020-01-01 09:23:00
# 4 4 2020-01-01 09:24:00
这是解析第二个示例数据帧的一次尝试。和以前一样,我们确实需要对数据框进行一些“编辑”以使其可用。
import pandas as pd
from io import StringIO
from dateutil.parser import parse
s=""" dates values cat
0 2020-01-01 09:20:00 0.758513 a
1 2020-01-01 09:21:00 0.337325 b
2 2020-01-01 09:22:00 0.618372 b
3 2020-01-01 09:23:00 0.878714 b
4 2020-01-01 09:24:00 0.311069 b"""
df = pd.read_csv(StringIO(s), sep="\s+").reset_index()
df
# level_0 level_1 dates values cat
# 0 0 2020-01-01 09:20:00 0.758513 a
# 1 1 2020-01-01 09:21:00 0.337325 b
# 2 2 2020-01-01 09:22:00 0.618372 b
# 3 3 2020-01-01 09:23:00 0.878714 b
# 4 4 2020-01-01 09:24:00 0.311069 b
df['dates'] = df['level_1'] + " " + df['dates']
df = df.drop(['level_0', 'level_1'], axis=1)
df['dates'] = df['dates'].apply(parse)
df
# dates values cat
# 0 2020-01-01 09:20:00 0.758513 a
# 1 2020-01-01 09:21:00 0.337325 b
# 2 2020-01-01 09:22:00 0.618372 b
# 3 2020-01-01 09:23:00 0.878714 b
# 4 2020-01-01 09:24:00 0.311069 b
df.dtypes
# dates datetime64[ns]
# values float64
# cat object
# dtype: object
我通常对 Pandas SO 问题所做的只是引用日期和时间值(在复制粘贴之后)。如果行数很多,我将使用文本编辑器执行 Find/Replace,通常在年份模式之前 (20XX
) 和日模式之后 (-01
) 添加引号。从那里,使用 StringIO
,指定 parse_dates
并根据需要在 read.csv
(或 read.table
)
index_col
参数
日期时间作为索引
from io import StringIO
import pandas as pd
txt = ''' A
"2020-01-01 09:20:00" 0
"2020-01-01 09:21:00" 1
"2020-01-01 09:22:00" 2
"2020-01-01 09:23:00" 3
"2020-01-01 09:24:00" 4'''
df = pd.read_csv(StringIO(txt), sep="\s+", parse_dates=True)
df.index
# DatetimeIndex(['2020-01-01 09:20:00', '2020-01-01 09:21:00',
# '2020-01-01 09:22:00', '2020-01-01 09:23:00',
# '2020-01-01 09:24:00'],
# dtype='datetime64[ns]', freq=None)
日期时间列
txt = ''' dates value cat
0 "2020-01-01 09:20:00" 0.758513 a
1 "2020-01-01 09:21:00" 0.337325 b
2 "2020-01-01 09:22:00" 0.618372 b
3 "2020-01-01 09:23:00" 0.878714 b
4 "2020-01-01 09:24:00" 0.311069 b'''
df = pd.read_csv(StringIO(txt), sep="\s+", index_col=[0], parse_dates=["dates"])
df.dtypes
# dates datetime64[ns]
# values float64
# cat object
# dtype: object